链接:点我
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; } }