题目来源
54. 螺旋矩阵
题目思路
while循环只遍历"环",不成环就不遍历了
四个边界
- 上边界 top : 0
- 下边界 bottom : matrix.length - 1
- 左边界 left : 0
- 右边界 right : matrix[0].length - 1
矩阵不一定是方阵
top < bottom && left < right 是循环的条件
无法构成“环”了,就退出循环,退出时可能是这 3 种情况之一:
top == bottom && left < right —— 剩一行
top < bottom && left == right —— 剩一列
top == bottom && left == right —— 剩一项(也算 一行/列)
处理剩下的单行或单列
因为是按顺时针推入结果数组的,所以
剩下的一行,从左至右 依次推入结果数组
剩下的一列,从上至下 依次推入结果数组
比如[[3],[4]]
左右相等,那么我们从上至下遍历
if(left == right){
for(int i = top;i<=bottom;i++){
list.add(matrix[i][left]);
}
}
代码实现
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
int left = 0;
int top = 0;
int bottom = matrix.length-1;
int right = matrix[0].length-1;
while(left < right && top < bottom){
// 上层
for(int i = left;i< right;i++){
list.add(matrix[top][i]);
}
//右侧
for(int i = top;i< bottom;i++){
list.add(matrix[i][right]);
}
//下侧
for(int i = right;i>left;i--){
list.add(matrix[bottom][i]);
}
//左侧
for(int i = bottom;i>top;i--){
list.add(matrix[i][left]);
}
left++;
top++;
bottom--;
right--;
}
if(top == bottom){
for(int i = left;i<=right;i++){
list.add(matrix[top][i]);
}
}else if(left == right){
for(int i = top;i<=bottom;i++){
list.add(matrix[i][left]);
}
}
return list;
}
}