螺旋矩阵相关题型,通过顺时针遍历二维数组进行求解,没有太好的办法,但是解法思路不难,最主要的是要注意遍历时的起始值。
我的是按照如下顺序遍历的(以循环的第一层为例):
其中,红色为横向遍历,黄色为纵向遍历,可以发现每次遍历的时候我都留一个,这样可以保证最后正好遍历完一圈。(怎么遍历否可以,但是自己要对好,否则会很乱)。
相关题目:
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int startx = 0;
int starty = 0;
int endx = 0;
int endy = 0;
int loop = 0;
int num = 1;
int record = 1;
while (loop < n / 2) {
for (int i = starty; i < n - record; i++) {
matrix[startx][i] = num++;
endy = i + 1;
}
for (int i = starty; i < n - record; i++) {
matrix[i][endy] = num++;
endx = i + 1;
}
for (int i = endy; i > starty; i--) {
matrix[endx][i] = num++;
endy = i - 1;
}
for (int i = endx; i > startx; i--) {
matrix[i][endy] = num++;
endx = i - 1;
}
startx++;
starty++;
record++;
loop++;
}
if (n % 2 == 1) {
matrix[n / 2][n / 2] = num;
}
return matrix;
}
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int circles = Math.min(m, n);
int startx = 0;
int starty = 0;
int endx = 0;
int endy = 0;
int index = 0;
int record = 1;
int loop = 0;
List<Integer> res = new ArrayList<>();
while (loop < circles / 2) {
for(int i = starty; i < n - record; i++) {
res.add(index++, matrix[startx][i]);
endy = i + 1;
}
for(int i = startx; i < m - record; i++) {
res.add(index++, matrix[i][endy]);
endx = i + 1;
}
for(int i = endy; i > starty; i--) {
res.add(index++, matrix[endx][i]);
endy = i - 1;
}
for(int i = endx; i > startx; i--) {
res.add(index++, matrix[i][endy]);
endx = i - 1;
}
startx++;
starty++;
record++;
loop++;
}
if(m - 2 * loop == 1) {
for(int i = starty; i <= n - record; i++) {
res.add(index++, matrix[startx][i]);
}
} else if(n - 2 * loop == 1) {
for(int i = startx; i <= m - record; i++) {
res.add(index++, matrix[i][starty]);
}
} else if(m - 2 * loop == 1 && n - 2 * loop == 1) {
res.add(index, matrix[m/2][n/2]);
}
return res;
}
可见,我们可以在循环里走完完整的一圈,而不足一圈的可以拿出来单独处理,以下是不满足完整一圈的三种情况:
(1)转完完整的一圈后,还剩下一行;
(2)转完完整的一圈后,还剩下一列;
(2)转完完整的一圈后,还剩下一个数。