螺旋矩陣 I、II、III

螺旋矩陣 I

來源:https://leetcode-cn.com/probl...java

image.png

簡潔解法:設定邊界,模擬便可。spa

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...3d

注意由於該題矩陣不是正方形,因此不可以用 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會被又一次加入結果集中,這樣結果就不對了。code

螺旋矩陣 II

來源:https://leetcode-cn.com/probl...blog

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...ci

螺旋矩陣 III

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

image.png

咱們能夠從開始的正方形開始,以螺旋形的形狀行走,而忽略咱們是否呆在網格中。最終,咱們必定已經到達了網格的每個角落。get

檢查咱們在每一個方向的行走長度,咱們發現以下模式:1,1,2,2,3,3,4,4,... 即咱們先向東走 1 單位,而後向南走 1 單位,再向西走 2 單位,再向北走 2 單位,再向東走 3 單位,等等。it

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

方向轉換:(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...

相關文章
相關標籤/搜索