54. 螺旋矩阵 - 力扣(LeetCode)
给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 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]提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
class Solution {
int x=0,y=0;
public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> arr = new ArrayList();
int row = matrix.length;
int col = matrix[0].length;
System.out.print(row);
int total = row * col - 1;
int count = 0;
arr.add(matrix[0][0]);
for(int i = 0 ;count < total; ++i) {
y+=1;
while(y<(col-i)) { arr.add(matrix[x][y]);y++;count++;}
if(count>=total) break;
y-=1;
x+=1;
while(x<(row-i)) { arr.add(matrix[x][y]);x++;count++;}
if(count>=total) break;
x-=1;
y-=1;
while(y>=i) { arr.add(matrix[x][y]);y--;count++;}
if(count>=total) break;
y+=1;
x-=1;
while(x>i) { arr.add(matrix[x][y]);x--;count++;}
if(count>=total) break;
x+=1;
}
return arr;
}
}
这是一道中等题,但是实际难度来算的话,博主觉得是达不到中等题的程度的,所以大家刷题的时候,不要被题目标记的难度所吓倒。、
这道题其实也是模拟就可以解决。主要的问题在于边界的控制。
按照这个例子来说,可以使用x,y来表示行和列,用arrlist来存储最后的答案。之后就是循环的问题了,循环无非就是对x,y进行操作,并且将操作完的元素加入arraylist就可以了。循环就需要涉及到用来循环控制的数,循环的控制条件就是arraylist是否已经将所有的数加入了,如果是,那么就无需继续循环了。所以可以用一个count来计数,一旦count和元素组中的元素个数相同,就是已经放完就可以退出循环了。
之后观察一下矩阵,发现是一圈一圈循环进去的,那么第一圈实际就是0行,竖列就是0列而最底下的第一圈就是row-1行,竖列就是col-1列。那我们在实际循环过程中可以使用小于来控制,那么实际写入的边界控制就是row行和col列。而row=row-0,col=col-0.发现了吗?如果没有,那么再走一行,横行是第1行,竖列是第1列,底下横行(边界控制的数)就是row-1,列就是col-1.所以实际上就可以用i,row-i,col-i来进行循环,就可以了,因为每列首个要去掉,所以可以将第一列第一个先放入,之后每次循环完就对x或y先进行一个+-1的操作,从而使数不会重复。
这样一道中等题就解决了。