Leetcode __54. 螺旋矩阵
问题描述
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路
从上边,到右边,到下边,到左边,依次遍历
从第一个外层按顺时针顺序排列的所有元素,然后是第二个外层的元素,依此类推。
我们首先定义四个元素,r1,r2,c1,c2,这将框定一个范围,我们顺时针打印这个范围边上的值,每次打印以后再次缩小框。
好的问题来了?
1.要打印几个框?
times=Math.min(长,宽)%2==0?Math.min(长,宽)/2:Math.min(长,宽)/2+1;
2.顺时针打印的横纵坐标变化规律?如图所示有颜色是要打印的框
实现
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
if (matrix.length == 0 || matrix == null) {
return new ArrayList<Integer>();
}
List<Integer> reslist = new ArrayList<>();
int m = matrix.length;//hang
int n = matrix[0].length;//lie
if (m == 1) {
for (int i = 0; i < n; i++) {
reslist.add(matrix[0][i]);
}
return reslist;
}
if (n == 1) {
for (int i = 0; i < m; i++) {
reslist.add(matrix[i][0]);
}
return reslist;
}
int c1 = 0;
int c2 = n - 1;
int r1 = 0;
int r2 = m - 1;
int times = Math.min(m, n) % 2 == 0 ? Math.min(m, n) / 2 : Math.min(m, n) / 2 + 1;
for (int i = 0; i < times; i++) {
for (int c = c1; c <= c2; c++) {
reslist.add(matrix[r1][c]);
}
for (int j = r1 + 1; j <=r2; j++) {
reslist.add(matrix[j][c2]);
}
if (c1 < c2 && r1 < r2) {
for (int a = c2 - 1; a > c1; a--) {
reslist.add(matrix[r2][a]);
}
for (int b = r2; b > r1; b--) {
reslist.add(matrix[b][c1]);
}
}
c1++;
c2--;
r1++;
r2--;
}
return reslist;
}
}