螺旋矩阵 I
来源:https://leetcode-cn.com/probl...
简洁解法:设定边界,模拟即可。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
int t = 0, b = matrix.length - 1;
int l = 0, r = matrix[0].length - 1;
while (true) {
for (int j = l; j <= r; j++) // left to right
ans.add(matrix[t][j]);
if (++t > b)
break;
for (int i = t; i <= b; i++) // top to bottom
ans.add(matrix[i][r]);
if (--r < l)
break;
for (int j = r; j >= l; j--) // right to left
ans.add(matrix[b][j]);
if (--b < t)
break;
for (int i = b; i >= t; i--) // bottom to top
ans.add(matrix[i][l]);
if (++l > r)
break;
}
return ans;
}
}
参考:https://leetcode-cn.com/probl...
注意因为该题矩阵不是正方形,所以不能够用 while (num < total)
作为外层循环判断条件,原因可以参考示例2,当外边循环一圈后,只剩下6和7时,l = 1, r = 2, t = 1, b = 1
,内层第一个 for 循环会把6,7加入到结果中,但是到第四个 for 循环时,l = 1, r = 1, t = 2, b = 0
,由于 l <= r
所以6会被又一次加入结果集中,这样结果就不对了。
螺旋矩阵 II
来源:https://leetcode-cn.com/probl...
class Solution {
public int[][] generateMatrix(int n) {
int[][] mat = new int[n][n];
int l = 0, r = n - 1;
int t = 0, b = n - 1;
int num = 1, total = n * n;
while(num <= total){
for(int i = l; i <= r; i++) // left to right
mat[t][i] = num++;
t++;
for(int i = t; i <= b; i++) // top to bottom
mat[i][r] = num++;
r--;
for(int i = r; i >= l; i--) // right to left
mat[b][i] = num++;
b--;
for(int i = b; i >= t; i--) // bottom to top
mat[i][l] = num++;
l++;
}
return mat;
}
}
参考:https://leetcode-cn.com/probl...
螺旋矩阵 III
https://leetcode-cn.com/probl...
我们可以从开始的正方形开始,以螺旋形的形状行走,而忽略我们是否呆在网格中。最终,我们一定已经到达了网格的每一个角落。
检查我们在每个方向的行走长度,我们发现如下模式:1,1,2,2,3,3,4,4,... 即我们先向东走 1 单位,然后向南走 1 单位,再向西走 2 单位,再向北走 2 单位,再向东走 3 单位,等等。
规律:A0 = 1, A1 = 1, A2 = 2, A3 = 2, ..., An= n / 2 + 1
方向转换:(0, 1) -> (1, 0) -> (0, -1) -> (-1, 0)
四个方向循环
规律:(dx, dy) -> (dy, -dx) -> (-dx, -dy) -> (-dy, dx)
public int[][] spiralMatrixIII(int R, int C, int x, int y) {
int[][] ans = new int[R * C][2];
int n = 0;
int dx = 0, dy = 1;
int num = 0, total = R * C;
while (num < total) {
for (int i = 0; i < n / 2 + 1; i++) {
if (x >= 0 && x < R && y >= 0 && y < C) {
ans[num++] = new int[] {x, y};
}
x += dx;
y += dy;
}
int tmp = dx;
dx = dy;
dy = -tmp;
n++;
}
return ans;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。