54. 螺旋矩阵 - LeetCode

54. 螺旋矩阵

题目链接

螺旋枚举

  • 使用变量:
    • 使用len[]记录两个维度的长度
    • 使用marked[][]记录已经枚举过的位置
    • 使用pos[]记录当前枚举到的位置
    • delta表示下一步的偏移量,i表示下一步要偏移的维度,cnt表示已经枚举过的数量
  • 具体算法:
    • 每次枚举,先进行偏移,若超出矩阵范围,或是已经枚举过了,就换一个维度,如果已经换过一次维度,就换个方向
    • 注意,初始是枚举第二个维度,即方向向右
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int[] len = {matrix.length, matrix[0].length};
        List<Integer> ans = new ArrayList<>();
        boolean[][] marked = new boolean[len[0]][len[1]];
        int[] pos = new int[2];
        int delta = 1, i = 1, cnt = 0;
        while(cnt < len[0] * len[1]){
            ans.add(matrix[pos[0]][pos[1]]);
            marked[pos[0]][pos[1]] = true;
            cnt++;
            pos[i] += delta;
            if(pos[i] < 0 || pos[i] >= len[i] || marked[pos[0]][pos[1]]){
                pos[i] -= delta;
                if(i == 1) i = 0;
                else{
                    i = 1;
                    delta = -delta;
                } 
                pos[i] += delta;
            }
        }
        return ans;
    }
}
posted @ 2021-03-13 16:02  一天到晚睡觉的鱼  阅读(47)  评论(0编辑  收藏  举报