給定一個包含 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;
}
}