给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
做完II以后再来看一,貌似挺简单的,但其实有很多需要注意的地方。
1.首先要给输入判空,不然在计算left/bottom会越界。二维矩阵判空的方法:
if(matrix.length==0||(matrix.length==1&&matrix[0].length==0))
return res;
2.每读入一个数,计数num-1,读完最后一个数的时候,num=0,所以
while(num > 0){...}
3.此题中矩阵可以是m*n型的非正方形矩阵,所以每读完一行或者一列后,都要判断此时是否已经读完所有数字。不然会出现重复读的情况。(可以拿[[1,2,3,4],[5,6,7,8],[9,10,11,12]]作为输入来验算重复读的情况。)
if(num <= 0)
break;
成功
显示详情
执行用时 : 1 ms, 在Spiral Matrix的Java提交中击败了94.59% 的用户
内存消耗 : 34.2 MB, 在Spiral Matrix的Java提交中击败了80.04% 的用户
class Solution {
public List spiralOrder(int[][] matrix) {
List res = new ArrayList();
if(matrix.length==0||(matrix.length==1&&matrix[0].length==0))
return res;
int left = 0;
int right = matrix[0].length-1;
int top = 0;
int bottom = matrix.length-1;
int num = (right+1)*(bottom+1);
while(num > 0){
for(int j=left; j<=right; j++){
res.add(matrix[top][j]);
num--;
}
if(num <= 0)
break;
top++;
for(int i=top; i<=bottom; i++){
res.add(matrix[i][right]);
num--;
}
if(num <= 0)
break;
right--;
for(int j=right; j>=left; j--){
res.add(matrix[bottom][j]);
num--;
}
if(num <= 0)
break;
bottom--;
for(int i=bottom; i>=top; i--){
res.add(matrix[i][left]);
num--;
}
if(num <= 0)
break;
left++;
}
return res;
}
}