给定一个包含 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;
}
}