思路
延续上题的矩阵消除法的思路,从外向里访问矩阵元素时,始终是在当前矩阵的最上方从左到右——>最右列从上到下——>最下方从右到左——>最左列从下到上访问。
- 遍历结束的条件是每个元素均被访问到,即返回的含有
m*n
个元素的一维数组被填满。 - 时间复杂度O(mn)
代码
public int[] spiralOrder(int[][] matrix) {
if(matrix==null || matrix.length==0 || matrix[0].length==0) {
//return null ;
return new int[0]; //测试用例[],输出[]
}
int rowlength = matrix.length; //行长度
int colength = matrix[0].length; //列长度
int printLength = rowlength * colength;
int[] printMatrix = new int[printLength];
int n=0;
int left=0, right=colength-1, top=0, bottom=rowlength-1;
while(n<printLength) {
// top:left->right
for(int i=left;i<=right && n<printLength;i++) {
printMatrix[n]=matrix[top][i];
n++;
}
top++;
// right: top->bottom
for(int i=top;i<=bottom && n<printLength;i++) {
printMatrix[n] = matrix[i][right];
n++;
}
right--;
// bottom: right->left
for(int i=right;i>=left && n<printLength;i--) {
printMatrix[n] = matrix[bottom][i];
n++;
}
bottom--;
// left: bottom->top
for(int i=bottom;i>=top && n<printLength;i--) {
printMatrix[n] = matrix[i][left];
n++;
}
left++;
}
return printMatrix;
}