力扣54题
题目描述:
给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
题解思路:
54题和59题 螺旋矩阵Ⅱ 有些微区别,59是n×n的方形矩阵,但是54需要考虑行和列不相等的情况,行>列 和列 >行都是需要考虑进去的,因此需要选择短边来表示顺时针添加的圈数。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;// 矩阵行
int n = matrix[0].length;// 矩阵列
int x = 0;
int y = 0;
int i = 0;
int j = 0;
int offset = 1; // 表示每一行或每一列都有 1个元素不操作
int loop = 0;
List<Integer> res = new ArrayList<>();
// 需要顺时针转的圈数,如果是偶数后面不需要再单独判断,如果是奇数后面会再添加一下
while (loop < Math.min(m, n) / 2) {
// 从左到右添加
for (j = y; j < n - offset; j++) {
res.add(matrix[x][j]);
}
// 从上到下添加
for (i = x; i < m - offset; i++) {
res.add(matrix[i][j]);
}
// 从右到左添加
for (; j > y; j--) {
res.add(matrix[i][j]);
}
// 从下到上添加
for (; i > x; i--) {
res.add(matrix[i][j]);
}
loop++;
x++;
y++;
offset++;
}
// 处理 行或列中没有处理到的情况
if (Math.min(m, n) % 2 == 1) {
// m > n 的情况,即 行 > 列,表示中间有一列数据没有处理
// 遍历次数是 m-n+1
if (m > n) {
for (int t = 0; t < m - n + 1; t++) {
res.add(matrix[x++][y]);
}
} else {
// 中间有一行的数据没有处理
for (int t = 0; t < n - m + 1; t++) {
res.add(matrix[x][y++]);
}
}
}
return res;
}
}