给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
顺时针走,用whlie走每一横向或者列项,一圈需要4个。.
class Solution {
public static List<Integer> spiralOrder(int[][] matrix) {
List <Integer> list = new ArrayList<>();
if(matrix.length==0){
return list;
}
int m=matrix.length;
int n=matrix[0].length;
int count = m*n;
//s是上边界,x是下边界
int s=0,x=m-1;
//l是左边界,r是右边界 。
int l=0,r=n-1;
// a,b是数组位子
int a=0,b=0;
list.add(matrix[a][b]);
int i=1;
while(i<count){
//内置while 对应 向右走,下走,左走,上走。
//a==s标志在最上边界位子,需要向右走,b<r不能超过有右边界。
//由于内部循环对r l s x +1操作 可能在最后一行、列的时候出边界,需要随时判断count。
while(a==s&&b<r&&i<count){
i++;
b++;
list.add(matrix[a][b]);
}
//向右走完,标志一层已经走完,需向下移一层,上边界+1即s++
if (a==s&&b==r){
s++;
}
//b==r即在最右边界的时候需下走。并且不能超过下边界x,故a<x
while(b==r&&a<x&&i<count){
i++;
a++;
list.add(matrix[a][b]);
}
//向下走完,标志最右列已经走完,右边界-1即r--
if (b==r&&a==x){
r--;
}
//a==x即在最下边界的时候需要向左移动,移动不超过左边界 b>l
while(a==x&&b>l&&i<count){
i++;
b--;
list.add(matrix[a][b]);
}
//移动到最左边界的时候,最下曾已经走完,下边界-1,即x--
if(a==x&&b==l){
x--;
}
//b==l即在最左边界的时候需要向上移动,移动不超过上边就 a>s
while (b==l&&a>s&&i<count){
i++;
a--;
list.add(matrix[a][b]);
}
//移动到最上边就的时候,最左列已经走完,左边界+1 即r++
if(b==l&&a==s){
l++;
}
//进行第二圈
}
return list;
}
}