(数组与矩阵) 剑指 Offer 29. 顺时针打印矩阵 ——【Leetcode每日一题】

❓ 剑指 Offer 29. 顺时针打印矩阵

难度:简单

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

限制

  • 0 < = m a t r i x . l e n g t h < = 100 0 <= matrix.length <= 100 0<=matrix.length<=100
  • 0 < = m a t r i x [ i ] . l e n g t h < = 100 0 <= matrix[i].length <= 100 0<=matrix[i].length<=100

注意:本题与 54. 螺旋矩阵 相同!

思路:模拟

一层一层从外到里打印,观察可知每一层打印都有相同的处理步骤,唯一不同的是上下左右的边界不同了。
(数组与矩阵) 剑指 Offer 29. 顺时针打印矩阵 ——【Leetcode每日一题】_第1张图片

  • 因此定义四个变量 up, down , left, right 分别存储上下左右边界值,从而定义当前最外层。

  • 循环打印当前最外层的顺序:

    • 从左到右打印最上一行->从上到下打印最右一行->从右到左打印最下一行->从下到上打印最左一行
      (数组与矩阵) 剑指 Offer 29. 顺时针打印矩阵 ——【Leetcode每日一题】_第2张图片

代码:(C++、Java)

C++

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int up = 0, down = matrix.size() - 1;
        if(down < 0) return {};
        int left = 0, right = matrix[0].size() - 1;
        vector<int> ans((down + 1) * (right + 1));
        int index = 0;
        while(up <= down && left <= right){
            for(int j = left; j <= right; j++){//往右
                ans[index++] = matrix[up][j];
            }
            if(++up > down) break;//上边界加1
            for(int j = up; j <= down && left <= right; j++){//往下
                ans[index++] = matrix[j][right];
            }
            if(left > --right) break;//右边界减1
            for(int j = right; j >= left && up <= down; j--){//往左
                ans[index++] = matrix[down][j];
            }
            if(up > --down) break;//下边界减1
            for(int j = down; j >= up && left <= right; j--){//往上
                ans[index++] = matrix[j][left];
            }
            if(++left > right) break;//左边界加1
        }
        return ans;
    }
};

Java

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        int up = 0, down = matrix.length - 1;
        if(down < 0) return new int[0];
        int left = 0, right = matrix[0].length - 1;
        int[] ans = new int[(down + 1) * (right + 1)];
        int index = 0;
        while(up <= down && left <= right){
            for(int j = left; j <= right; j++){//往右
                ans[index++] = matrix[up][j];
            }
            if(++up > down) break;//上边界加1
            for(int j = up; j <= down && left <= right; j++){//往下
                ans[index++] = matrix[j][right];
            }
            if(left > --right) break;//右边界减1
            for(int j = right; j >= left && up <= down; j--){//往左
                ans[index++] = matrix[down][j];
            }
            if(up > --down) break;//下边界减1
            for(int j = down; j >= up && left <= right; j--){//往上
                ans[index++] = matrix[j][left];
            }
            if(++left > right) break;//左边界加1
        }
        return ans;
    }
}

运行结果:

(数组与矩阵) 剑指 Offer 29. 顺时针打印矩阵 ——【Leetcode每日一题】_第3张图片

复杂度分析:

  • 时间复杂度 O ( m n ) O(mn) O(mn),其中mn 分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。
  • 空间复杂度 O ( 1 ) O(1) O(1),除了输出数组以外,空间复杂度是常数。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

你可能感兴趣的:(LeetCode,矩阵,leetcode,线性代数)