输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
按层打印
从最外层逐层向内层打印
通过左上角的点和右上角的点来划分每一层
从外层到下一层只需左上角点的横纵坐标+1 右下角点的横纵坐标-1
class Solution {
ArrayList<Integer> res;
public int[] spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0){
return new int[0];
}
res = new ArrayList<Integer>();
int R1 = 0;
int C1 = 0;
int R2 = matrix.length - 1;
int C2 = matrix[0].length - 1;
while(R1 <= R2 && C1 <= C2){
print(matrix, R1++, R2--, C1++, C2--);
}
int[] ans = new int[matrix.length * matrix[0].length];
int index = 0;
for(int i : res){
ans[index++] = i;
}
return ans;
}
private void print(int[][] matrix, int R1, int R2, int C1, int C2){
int curR = R1;
int curC = C1;
if(R1 == R2){
for(int i = C1; i <= C2; i++){
res.add(matrix[R1][i]);
}
return;
}
if(C1 == C2){
for(int i = R1; i <= R2; i++){
res.add(matrix[i][]);
}
return;
}
while(curC < C2){
res.add(matrix[R1][curC++]);
}
while(curR < R2){
res.add(matrix[curR++][C2]);
}
while(curC > C1){
res.add(matrix[R2][curC--]);
}
while(curR > R1){
res.add(matrix[curR--][C1]);
}
}
}