59. Spiral Matrix II
数组:这个循环可以转懵很多人!
Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order.
Example 1:
Input: n = 3
Output: [[1,2,3],[8,9,4],[7,6,5]]
Example 2:
Input: n = 1
Output: [[1]]
Constraints:
1 <= n <= 20
逻辑分析:
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人。
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。
这也是坚持了每条边左闭右开的原则。
一些同学做这道题目之所以一直写不好,代码越写越乱。
就是因为在画每一条边的时候,一会左开又闭,一会左闭右闭,一会又来左闭右开,岂能不乱。
那么我按照左闭右开的原则,来画一圈,大家看一下:
JAVA实现代码:
/**
思路:
1.以循环次数作为外循环
2.每条边作为内循环
*/
class Solution {
public int[][] generateMatrix(int n) {
int count=1;//填充数字
int[][] res = new int[n][n];
int loop = n/2;//循环次数
int sideSize=n-1;//循环边大小
//数组下标
int startX=0;
int startY=0;
while(loop>0){
//上边->从左到右
for(int i=0;i<sideSize;i++){
res[startX][startY++]=count++;
}
//右边->从上到下
for(int i=0;i<sideSize;i++){
res[startX++][startY]=count++;
}
//下边->从右到左
for(int i=0;i<sideSize;i++){
res[startX][startY--]=count++;
}
//左边->从下到上
for(int i=0;i<sideSize;i++){
res[startX--][startY]=count++;
}
//循环圈缩减
startX++;
startY++;
sideSize-=2;
loop--;
}
int mid=n/2;
//n为奇数时中间有一个未填写值
if (n% 2 == 1) {
res[mid][mid] = count;
}
return res;
}
}