天天看點

LeetCode 54 螺旋矩陣

給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,傳回矩陣中的所有元素。

思路

順時針循環掃描可以将每個循環分為四個階段

1. 在第一行 從第一列掃描至最後一列

2. 在最後一列 從 第二行掃描到最後一行

3. 在最後一行 從 倒數第二列 掃描到 第一列

4. 在第一列 從 倒數第二行 掃描的 第二行

使用兩個參數col row 來作為工作指針進行掃描。Sc、Sr用來表示行列的起始行列數,Ec、Er用來表示行列掃描的結束行列數。每次循環結束時,對着四個參數進行更新。

注意:

1. 循環需要滿足 第一行起始行列數需要小于等于結束行列數。

2. 在每個循環的第一個階段完成之後 需要判斷目前矩陣是否已經隻有一行,如果隻有一行則沒必要進行下面的步驟,直接break。

3. 在每個循環的第二階段完成之後 需要判斷 目前矩陣是否已經隻有一列,如果隻有一列則沒必要進行下面的步驟,直接break。(如果進行了下面的步驟,會對元素重複掃描)

4. 每個階段進行掃描時需要對col row 進行初始化

代碼

import java.util.ArrayList;
import java.util.List;

public class Spiral_Matrix_54 {
    /**
     * @return java.util.List<java.lang.Integer>
     * @author chy
     * @creed: Talk is cheap,show me the code
     * @date 27/5/2019 8:31 PM
     * @desc: 54 給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,傳回矩陣中的所有元素。
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        if (matrix.length == 0)
            return new ArrayList<>();
        int Sr = 0, Sc = 0, Ec = matrix[0].length - 1, Er = matrix.length - 1;
        List<Integer> res = new ArrayList<>();

        while (Sc <= Ec && Sr <= Er) {
            int row = Sr, col = Sc;
            for (; col <= Ec; col++)
                res.add(matrix[row][col]);
            if (Sr == Er)
                break;
            for (col = Ec, row = Sr + 1; row <= Er; row++)
                res.add(matrix[row][col]);
            if (Sc == Ec)
                break;
            for (row = Er, col = Ec - 1; col >= Sc; col--)
                res.add(matrix[row][col]);
            for (col = Sc, row = Er - 1; row >= Sr + 1; row--)
                res.add(matrix[row][col]);
            Sc++;
            Sr++;
            Ec--;
            Er--;
        }
        return res;
    }

    public static void main(String[] argc) {
        List<Integer> res = new Spiral_Matrix_54().spiralOrder(new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}});
        return;
    }
}

           

繼續閱讀