错误解法:以轮数定义旋转过程进行输出
java
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;
}
}
错误原因:不适合只有行的数组

解法一:对上面方法进行改进,更改循环结束的判断。
**如何判断路径是否结束?**由于矩阵中的每个元素都被访问一次,因此路径的长度即为矩阵中的元素数量,当路径的长度达到矩阵中的元素数量时即为完整路径,将该路径返回。
java
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