54. Spiral Matrix

顺时针打印矩阵,重点在于行列的取值范围。首先算出圈数cycle(行列的最小值一半的上界,画一下图就知道了),然后取变量i在cycle中进行循环打印。

  • 打印最上行:行不变列变,坐标:[i][j],列的取值范围:[i, col - i)
  • 打印最右列:行变列不变,坐标:[j][col - i - 1],行的取值范围:[i + 1, row - i)
  • 打印最下行:行不变列变,坐标:[row - i - 1][j],列的取值范围:[col - i - 2, i],并且当前行不可以等于最后一行:i != row - i - 1(防止重复打印同一行)
  • 打印最左列:行变列不变,坐标:[j][i],行的取值范围:[row - i - 2, i),并且当前列不可等于最后一列i != col - i - 1(防止重复打印同一列)

matrix注意判空,防止列数为0

public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> res = new ArrayList<>();
    if (matrix == null || matrix.length == 0) return res;
    int row = matrix.length;
    int col = matrix[0].length; 
    int cycle = ((row < col ? row : col) + 1) / 2;
    for (int i = 0; i < cycle; i++) {
        for (int j = i; j < col - i; j++) {
            res.add(matrix[i][j]);
        }
        for (int j = i + 1; j < row - i; j++) {
            res.add(matrix[j][col - i - 1]);
        }
        for (int j = col - i - 2; j >= i && i != row - i - 1; j--) {
            res.add(matrix[row - i - 1][j]);
        }
        for (int j = row - i - 2; j > i && i != col - i - 1; j--) {
            res.add(matrix[j][i]);
        }
    }
    return res;
}

results matching ""

    No results matching ""