错误解法:以轮数定义旋转过程进行输出
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new LinkedList<>();int round=0; // 已经循环的轮数int i=0,j=0;int m=matrix.length, n=matrix[0].length;while(round==0||round<Math.min(m,n)/2){// 👉while(j<n-round){list.add(matrix[i][j]);j++;}// 👇j--;i++;while(i<m-round){list.add(matrix[i][j]);i++;}// 👈i--;j--;while(j>=round){list.add(matrix[i][j]);j--;}// 👆j++;i--;while(i>=round+1){list.add(matrix[i][j]);i--;}i++;j++;round++;}while(j<n-round){list.add(matrix[i][j]);j++;}return list;}
}
错误原因:不适合只有行的数组
解法一:对上面方法进行改进,更改循环结束的判断。
**如何判断路径是否结束?**由于矩阵中的每个元素都被访问一次,因此路径的长度即为矩阵中的元素数量,当路径的长度达到矩阵中的元素数量时即为完整路径,将该路径返回。
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new LinkedList<>();int round=0; // 已经循环的轮数int len=0; // 路径长度int i=0,j=0;int m=matrix.length, n=matrix[0].length;// 👉while(j<n-round){list.add(matrix[i][j]);j++;}while(true){// 👇j--;i++;while(i<m-round){list.add(matrix[i][j]);i++;if(list.size()>=n*m){break;}}if(list.size()>=n*m){break;}// 👈i--;j--;while(j>=round){list.add(matrix[i][j]);j--;if(list.size()>=n*m){break;}}if(list.size()>=n*m){break;}// 👆j++;i--;while(i>=round+1){list.add(matrix[i][j]);i--;if(list.size()>=n*m){break;}}if(list.size()>=n*m){break;}// 👉i++;j++;while(j<n-round-1){list.add(matrix[i][j]);j++;if(list.size()>=n*m){break;}}if(list.size()>=n*m){break;}round++;}return list;}
}
注意:
- 在每一次向list中加入数据,都判断是否到达指定数目,到达则
break