题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
顺时针就意味着方向顺序是有一定规律的:一开始从左到右,再从上到下,再从右到左,在从下到上。每一个方向写一个循环遍历一行或者一列的元素,这样4个方向有4个循环,循环的顺序就定下来了。
再往深的想,访问是按一行或一列来的,从矩阵的外到里,可以设置4个边界:left,right,top,bottom,边界里面(包括边界)shi 未被访问的内容,访问过了就不用管了。先循环访问上边界top那一行的元素,这一行循环结束之后top就自增1了,表示最上面那行访问完了,接着就是访问右边界,循环结束后,右边界自减1,这样右边界就左移了一列,同样的方式处理下边界和左边界……如果边界移动后发现左边界越过了右边界,上边界越过了下边界,就说明已经访问过所有的元素,跳出大循环。
代码(Java):
public class Solution {
public static void main(String[] args) {
int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for(int i = 0;i<matrix.length;i++) {
for(int j = 0;j<matrix[0].length;j++) {
System.out.print(matrix[i][j]+"\t");
}
System.out.println();
}
int[] ans = spiralOrder(matrix);
for(int num:ans) {
System.out.print(num+"\t");
}
}
public static int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int left = 0; //矩阵的左边界
int right = matrix[0].length-1; //右边界
int top = 0; //上边界
int bottom = matrix.length-1; //下边界
int x = 0; //返回数组里面的元素下表
int[] res = new int[(bottom+1) * (right+1)]; //定义返回数组
while(true) {
for(int i = left;i<=right;i++) {//在上边界这一行,从左边界遍历到右边界
res[x] = matrix[top][i];
x++;
}
top++; //把上边界的元素都记录好之后,上边界就下移一行了
if(top>bottom) break; //如果上边界下移之后超过了下边界,循环结束
for(int i = top;i<=bottom;i++) { //上边界从左到右记录之后,在右边界从上往下,注意上边界已经完成下移了
res[x] = matrix[i][right];
x++;
}
right--; //右边界的元素记录好了,右边界往左移一列
if(left>right) break; //如果右边界左移超过了左边界,循环结束
for(int i = right;i>=left;i--) { //右边界从上往下之后,就是下边界从右往左,注意右边界已经左移了
res[x] = matrix[bottom][i];
x++;
}
bottom--; //下边界的元素记录好了,下边界就往上一行
if(top>bottom) break; //如果下边界上移超过了上边界,循环结束
for(int i = bottom;i>=top;i--) { //下边界从右往左之后,就是左边界从下往上,注意下边界和上边界都已经改变了
res[x] = matrix[i][left];
x++;
}
left++; //左边界的元素记录好了,左边界往右移一列
if(left>right) break; //如果左边界往左移超过了右边界,循环结束
}
return res;
}
}