先贴代码
java
class Solution {
public int[][] generateMatrix(int n) {
int left = 0;
int right = n-1;
int up = 0;
int down = n-1;
int[][] result = new int[n][n];
int number = 0;
while(left <= right && up <= down) {
for(int i=left;i<=right;i++) {
number++;
result[up][i] = number;
}
up++;
for(int i=up;i<=down;i++) {
number++;
result[i][right] = number;
}
right--;
for(int i=right;i>=left;i--) {
number++;
result[down][i] = number;
}
down--;
for(int i=down;i>=up;i--) {
number++;
result[i][left] = number;
}
left++;
}
return result;
}
}
我其实不止一次做过这道题,巧的是前面几次做完就忘记了..其实编程题真的应该自己去做,而不是看答案,那样太容易遗忘。并且一个很好用的方法是画示意图,把一些变量的变化过程给标记出来。
螺旋矩阵重在矩阵的切割,你是如何给矩阵分块以及上下左右的索引的增减。
1、矩阵分块
以三阶矩阵为例,
|---|---|---|
| 1 | 2 | 3 |
| 8 | 9 | 4 |
| 7 | 6 | 5 |
我们可以以1、2为块,然后以3、4为块,5、6为块,7,8为块,9为块
我使用的是以1、2、3为块,4,5为块,6、7为块,8为块,9为块
每次块结束后需要对索引值进行增减(以1、2为块似乎不用每次进行上下左右索引的增减,只需要在每次一圈结束后增加一个索引即可)
2、索引增减
首先设置left=0;right=n-1;up=0;down=n-1;
第一阶段从左到右,结束后对上索引加一(从左到右是i++)
第二阶段从上到下,结束后对右索引减一(从上到下是i++)
第三阶段从右到左,结束后对下索引减一(从右到左是i--)
第四阶段从下到上,结束后对左索引加一(从下到上是i--)
其实一个非常巧合的规律是,上一个阶段的索引加减刚好是下一个阶段的开始方向
最后我们可以定义退出循环的条件是
1、left <= right && up <= down
2、number <= n * n
1或者2都是可行的