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 中提出了三种解法中的第一种的延续,后面两种在解法在解决当前这道题的时候或多或少都会有点问题,不建议使用。
笨方法有时候就是最通用的方法。

相关题

59. 螺旋矩阵 II