• 剑指offer 19. 顺时针打印矩阵 & leetcode 剑指 Offer 29. 顺时针打印矩阵


    19. 顺时针打印矩阵

    题目描述

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    思路:

    链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion

    定义四个变量代表范围,up、down、left、right

    1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错

    2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错

    3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错

    4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错

     1 import java.util.ArrayList;
     2 public class Solution {
     3     public ArrayList<Integer> printMatrix(int [][] matrix) {
     4        // 判断矩阵是否为空
     5         ArrayList<Integer> list = new ArrayList<>();
     6         int up = 0, down = matrix.length - 1;
     7         int left = 0, right = matrix[0].length - 1;
     8         if(matrix == null || down < 0 || left < 0){
     9             return list;
    10         }
    11         
    12         // 四个方向遍历矩阵, 动态更新四个边界值
    13         int col, row;
    14         while(true){
    15             // 最上面这行向右
    16             for(col = left; col <= right; col++){
    17                  list.add(matrix[up][col]);
    18             }
    19             up++;        // 更新上边界
    20             if(down < up){
    21                 break;
    22             }
    23             // 最右边这行向下
    24             for(row = up; row <= down; row++){
    25                 list.add(matrix[row][right]);
    26             }
    27             right--;    // 更新右边界
    28             if(left > right){
    29                 break;        // 如果越界则跳出循环
    30             }
    31             // 最下面这行向左
    32             for(col = right; col >= left; col--){
    33                 list.add(matrix[down][col]);
    34             }
    35             down--;    // 更新下边界
    36             if(up > down){
    37                 break;        // 如果越界则跳出循环
    38             }
    39             // 最左边这行向上
    40             for(row = down; row >= up; row--){
    41                 list.add(matrix[row][left]);
    42             }
    43             left++;    // 更新左边界
    44             if(left > right){
    45                 break;
    46             }
    47         }
    48         return list;
    49     }
    50 }

    leetcode运行时间为1ms - 96.82%, 空间为40.2MB - 37.45%

    复杂度分析:

    时间复杂度:遍历了整个矩阵,所以时间复杂度为O(rows*cols)

    空间复杂度:除了存储结果的矩阵,其他的空间都是常量级的,所以空间复杂度为O(1)

     

  • 相关阅读:
    harbor无法登陆解决
    k8s中使用harbor
    harbor扩容
    harbor设置开机自启
    设置开机自启
    关Java的内存模型(JMM)
    多线程相关概念
    多线程(JDK1.5的新特性互斥锁)
    synchronized关键字
    【异常】redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'PSETEX'
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12577637.html
Copyright © 2020-2023  润新知