54. 螺旋矩阵
54. 螺旋矩阵
分析
跟 59. 螺旋矩阵 II 相比,其实没什么差别,无非就是需要处理只有一横或者只有一竖的场景,其实这样很好处理,这样就不需要考虑到了边界转圈这些情况了,直接按一唯数组遍历即可。而且此时 rowNow 和 colNow 都不需要换。
解题
public List<Integer> spiralOrder(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
Integer[] resultArr = new Integer[rows * cols];
int rowNow = 0, colNow = 0;
int rowMin = 0, rowMax = rows - 1, colMin = 0, colMax = cols - 1;
for (int i = 0; i < rows * cols; i++) {
if (colMin == colMax && rowNow <= rowMax) {
// 不需要考虑转圈
resultArr[i] = matrix[rowNow][colNow];
rowNow++;
} else if (rowMin == rowMax && colNow <= colMax) {
// 不需要考虑转圈
resultArr[i] = matrix[rowNow][colNow];
colNow++;
} else if (rowNow == rowMin && colNow < colMax) {
resultArr[i] = matrix[rowNow][colNow];
colNow++;
} else if (colNow == colMax && rowNow < rowMax) {
resultArr[i] = matrix[rowNow][colNow];
rowNow++;
} else if (rowNow == rowMax && colMin < colNow) {
resultArr[i] = matrix[rowNow][colNow];
colNow--;
} else if (colNow == colMin && rowMin < rowNow) {
resultArr[i] = matrix[rowNow][colNow];
rowNow--;
if (colNow == colMin && rowNow == rowMin) {
rowMin++;
rowMax--;
colMin++;
colMax--;
// 重置起点
colNow++;
rowNow++;
}
}
}
return Arrays.asList(resultArr);
}
上面这种解法是我们在 59. 螺旋矩阵 II 中提出了三种解法中的第一种的延续,后面两种在解法在解决当前这道题的时候或多或少都会有点问题,不建议使用。
笨方法有时候就是最通用的方法。