解题思路:
首先计算一下上、右、下、左的边界总共会循环多少次,然后依次加进结果里面就可以了。
提交代码:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res=new ArrayList<Integer>();
if(matrix.length==0) return res;
int cntUp=(int)Math.ceil(matrix.length/2.0);
int cntBottom=matrix.length/2;
int cntLeft=matrix[0].length/2;
int cntRight=(int)Math.ceil(matrix[0].length/2.0);
int pUp=0,pBottom=0,pLeft=0,pRight=0;
while(pUp<cntUp||pBottom<cntBottom||pLeft<cntLeft||pRight<cntRight) {
// up
if(pUp<cntUp) {
for(int j=pUp;j<matrix[0].length-pUp;j++)
res.add(matrix[pUp][j]);
pUp++;
}
//right
if(pRight<cntRight) {
for(int j=pRight+1;j<matrix.length-pRight-1;j++)
res.add(matrix[j][matrix[0].length -1-pRight]);
pRight++;
}
//bottom
if(pBottom<cntBottom) {
for(int j=matrix[0].length-1-pBottom;j>=pBottom;j--)
res.add(matrix[matrix.length-1-pBottom][j]);
pBottom++;
}
//left
if(pLeft<cntLeft) {
for(int j=matrix.length-2-pLeft;j>pLeft;j--)
res.add(matrix[j][pLeft]);
pLeft++;
}
}
return res;
}
}
运行结果: