剑指 Offer 29. 顺时针打印矩阵
剑指 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 <= matrix.length <= 100
0 <= matrix[i].length <= 100
题解
记数组大小为:m*n
-
模拟顺时针旋转,每一个循环依次完成向右走、向下走、向左走和向上走这四个步骤。
-
每一个步骤用循环走到边界,循环结束后边界内移
- 上边界下移:top++
- 下边界上移:buttom--
- 左边界右移:left++
- 右边界左移:right--
-
当走够m*n个数时,退出循环
时间复杂度:O(m*n),空间复杂度:O(1)
代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix==null || matrix.length==0 || (matrix.length==1 && matrix[0].length==0)){
int[] res=new int[0];
return res;
}
int n=matrix.length * matrix[0].length;
int[] res=new int[n];
int count=0;
int left=0;
int right=matrix[0].length-1;
int top=0;
int buttom=matrix.length-1;
while(count<n){
for(int i=left;i<=right && count<n;i++){
//外循环和4个内循环都要判断count<n
//不然会继续执行后面的for循环,造成数组越界
res[count]=matrix[top][i];
count++;
}
top++;
for(int i=top;i<=buttom && count<n;i++){
res[count]=matrix[i][right];
count++;
}
right--;
for(int i=right;i>=left && count<n;i--){
res[count]=matrix[buttom][i];
count++;
}
buttom--;
for(int i=buttom;i>=top && count<n;i--){
res[count]=matrix[i][left];
count++;
}
left++;
}
return res;
}
}

浙公网安备 33010602011771号