59. 螺旋矩阵 II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
Solution: 使用上下左右四个指针up
, down
, left
, right
即可,遵循左→右
,上→下
,右→左
,下→上
的顺序填充即可。
class Solution {
public int[][] generateMatrix(int n) {
int up = 0, down = n - 1, left = 0, right = n - 1, i = 1, idx;
int[][] result = new int[n][n];
while (i <= n * n) {
for (idx = left; idx <= right; ++idx) {
result[up][idx] = i++;
}
++up;
for (idx = up; idx <= down; ++idx) {
result[idx][right] = i++;
}
--right;
for (idx = right; idx >= left; --idx) {
result[down][idx] = i++;
}
--down;
for (idx = down; idx >= up; --idx) {
result[idx][left] = i++;
}
++left;
}
return result;
}
}
54. 螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
Solution: 本题解法与上题类似,同样是上下左右四个指针,不过由于只是遍历所以不需要变量i
(上题中变量i
的目的是维护当前填充元素值),故在遍历过程中需要注意保持top ≤ down
以及 left ≤ right
, 一旦某次指针变动后该条件被违反,那么说明遍历结束,立即跳出while
循环。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
List<Integer> result = new ArrayList<Integer>(m * n);
int up = 0, down = m - 1, left = 0, right = n - 1, idx;
while (true) {
for (idx = left; idx <= right; ++idx) {
result.add(matrix[up][idx]);
}
if (++up > down) break;;
for (idx = up; idx <= down; ++idx) {
result.add(matrix[idx][right]);
}
if (--right < left) break;
for (idx = right; idx >= left; --idx) {
result.add(matrix[down][idx]);
}
if (--down < up) break;
for (idx = down; idx >= up; --idx) {
result.add(matrix[idx][left]);
}
if (++left > right) break;
}
return result;
}
}