螺旋矩阵 I

来源:https://leetcode-cn.com/probl...

image.png

简洁解法:设定边界,模拟即可。

spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x.png

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<>();
        
        int t = 0, b = matrix.length - 1;
        int l = 0, r = matrix[0].length - 1;
        
        while (true) {
            for (int j = l; j <= r; j++) // left to right
                ans.add(matrix[t][j]);
            if (++t > b) 
                break;
            
            for (int i = t; i <= b; i++) // top to bottom
                ans.add(matrix[i][r]);
            if (--r < l) 
                break;
            
            for (int j = r; j >= l; j--) // right to left
                ans.add(matrix[b][j]);
            if (--b < t) 
                break;
            
            for (int i = b; i >= t; i--) // bottom to top
                ans.add(matrix[i][l]);
            if (++l > r) 
                break;
        }
        return ans;
    }
}

参考:https://leetcode-cn.com/probl...

注意因为该题矩阵不是正方形,所以不能够用 while (num < total) 作为外层循环判断条件,原因可以参考示例2,当外边循环一圈后,只剩下6和7时,l = 1, r = 2, t = 1, b = 1,内层第一个 for 循环会把6,7加入到结果中,但是到第四个 for 循环时,l = 1, r = 1, t = 2, b = 0,由于 l <= r 所以6会被又一次加入结果集中,这样结果就不对了。

螺旋矩阵 II

来源:https://leetcode-cn.com/probl...

image.png

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] mat = new int[n][n];
    
        int l = 0, r = n - 1;
        int t = 0, b = n - 1;
        
        int num = 1, total = n * n;
        while(num <= total){
            for(int i = l; i <= r; i++) // left to right
                mat[t][i] = num++;
            t++;
            for(int i = t; i <= b; i++) // top to bottom
                mat[i][r] = num++;
            r--;
            for(int i = r; i >= l; i--) // right to left
                mat[b][i] = num++;
            b--;
            for(int i = b; i >= t; i--) // bottom to top
                mat[i][l] = num++;
            l++;
        }
        return mat;
    }
}

参考:https://leetcode-cn.com/probl...

螺旋矩阵 III

https://leetcode-cn.com/probl...

image.png

我们可以从开始的正方形开始,以螺旋形的形状行走,而忽略我们是否呆在网格中。最终,我们一定已经到达了网格的每一个角落。

检查我们在每个方向的行走长度,我们发现如下模式:1,1,2,2,3,3,4,4,... 即我们先向东走 1 单位,然后向南走 1 单位,再向西走 2 单位,再向北走 2 单位,再向东走 3 单位,等等。

规律:A0 = 1, A1 = 1, A2 = 2, A3 = 2, ..., An= n / 2 + 1

方向转换:(0, 1) -> (1, 0) -> (0, -1) -> (-1, 0) 四个方向循环
规律:(dx, dy) -> (dy, -dx) -> (-dx, -dy) -> (-dy, dx)

public int[][] spiralMatrixIII(int R, int C, int x, int y) {
    int[][] ans = new int[R * C][2];

    int n = 0;
    int dx = 0, dy = 1;

    int num = 0, total = R * C;
    while (num < total) {
        for (int i = 0; i < n / 2 + 1; i++) {
            if (x >= 0 && x < R && y >= 0 && y < C) {
                ans[num++] = new int[] {x, y};
            }
            x += dx;
            y += dy;
        }
        int tmp = dx;
        dx = dy;
        dy = -tmp;
        n++;
    }
    return ans;
}

参考:https://leetcode.com/problems...


csujiabin
1 声望0 粉丝