题目

54. 螺旋矩阵

题解



注:
bottom应该为: c from c2-1 ... c1+1
left应该为: r from r2 ... r1+1



代码

import java.util.*;

public class code54 {

    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<>();
        if (matrix.length == 0) {
            return ans;
        }
        int R = matrix.length;
        int C = matrix[0].length;
        boolean visit[][] = new boolean[R][C];
        int dr[] = { 0, 1, 0, -1 };
        int dc[] = { 1, 0, -1, 0 };
        // 当前所在位置为 (r, c),前进方向是 di
        int r = 0;
        int c = 0;
        int di = 0;
        for (int i = 0; i < R * C; i++) {
            ans.add(matrix[r][c]);
            visit[r][c] = true;

            // 下一步候选移动位置是 (cr, cc)
            int cr = r + dr[di];
            int cc = c + dc[di];
            if (0 <= cr && cr < R && 0 <= cc && cc < C && !visit[cr][cc]) {
                r = cr;
                c = cc;
            } else {
                di = (di + 1) % 4;
                r += dr[di];
                c += dc[di];
            }
        }
        return ans;
    }

    // public static List<Integer> spiralOrder(int[][] matrix) {
    // List<Integer> ans = new ArrayList<>();
    // if (matrix.length == 0) {
    // return ans;
    // }
    // int r1 = 0;
    // int r2 = matrix.length - 1;
    // int c1 = 0;
    // int c2 = matrix[0].length - 1;
    // while (r1 <= r2 && c1 <= c2) {
    // for (int c = c1; c <= c2; c++) {
    // ans.add(matrix[r1][c]);
    // }
    // for (int r = r1 + 1; r <= r2; r++) {
    // ans.add(matrix[r][c2]);
    // }
    // if (r1 < r2 && c1 < c2) {
    // for (int c = c2 - 1; c >= c1 + 1; c--) {
    // ans.add(matrix[r2][c]);
    // }
    // for (int r = r2; r >= r1 + 1; r--) {
    // ans.add(matrix[r][c1]);
    // }
    // }
    // r1++;
    // c1++;
    // r2--;
    // c2--;
    // }
    // return ans;
    // }

    public static void main(String[] args) {
        int matrix[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
        List<Integer> res = spiralOrder(matrix);
        System.out.println(res);
    }

}

参考

  1. 螺旋矩阵——题解一
  2. C++ 详细题解——题解二
  3. 螺旋矩阵——题解三
  4. 使用4个int right,down,left,up来记录当前要向这四个方向前进的优先级和前进的步数——题解四
  5. 模拟过程——题解五
  6. java 数组的行数和列数