题目描述
链接:点我
题解
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length , n = matrix[0].length;
// int[] ans = new int[m*n];
ArrayList<Integer> list = new ArrayList<Integer>();
//定义4个边界
int up = 0 , right = n - 1 , down = m - 1 , left = 0;
// while(true){
// for(int i = left;i <= right; i++) list.add(matrix[up][i]);
// if(up++ >= down) break; //更新边界越界就退出循环,同时表示也遍历完成,下方同理
// for(int i = up;i <= down; i++) list.add(matrix[i][right]);
// if(right-- <= left) break;
// for(int i = right;i >= left; i--) list.add(matrix[down][i]);
// if(down-- <= up) break;
// for(int i = down;i >= up; i--) list.add(matrix[i][left]);
// if(left++ >= right) break;
// }
//法二:相同的思维
int k = 0; //类似数组的长度道理,只需要遍历那么多次就行了
while(k < m*n){
for(int i = left;i <= right; i++) {
//边界不可越出,下方同理
if(up <= down){
list.add(matrix[up][i]);
k++;
}
}
up++; //每次遍历一行/列都要更新边界,下方同理
for(int i = up;i <= down; i++) {
if(right >= left){
list.add(matrix[i][right]);
k++;
}
}
right--;
for(int i = right;i >= left; i--) {
if(down >= up){
list.add(matrix[down][i]);
k++;
}
}
down--;
for(int i = down;i >= up; i--) {
if(left <= right){
list.add(matrix[i][left]);
k++;
}
}
left++;
}
return list;
}
}