一、题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
二、解题思路及代码
1.思路
根据题意可得,顺时针打印矩阵的顺序是“从左到右,从上到下,从右到左,从下到上”循环。
- 怎么定义循环的边界?
- 何时退出循环?
左→右:打印:l→r。打印后上边界缩小:t++。是否全打印完毕:t>b
上→下:打印:t→b。打印后上边界缩小:r–。是否全打印完毕:l>r
右→左:打印:r→l。打印后上边界缩小:b–。是否全打印完毕:t>b
下→上:打印:b→t。打印后上边界缩小:l++。是否全打印完毕:l>r
2.代码
利用index自增为res数组赋值
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int[] res = new int[matrix.length * matrix[0].length];
int l=0,r=matrix[0].length-1,t=0,b=matrix.length-1,index=0;
while(true){
//->右
for(int j=l;j<=r;j++) res[index++]=matrix[t][j];
if(++t>b) break;
//->下
//t已经自增过了,所以不用考虑会重复赋值,直接i=t初始就ok
for(int i=t;i<=b;i++) res[index++]=matrix[i][r];
if(l>--r) break;
//左<-
for(int j=r;j>=l;j--) res[index++]=matrix[b][j];
if(t>--b) break;
//->上
for(int i=b;i>=t;i--) res[index++]=matrix[i][l];
if(++l>r) break;
}
return res;
}
}
侵删