题目描述:
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
思路:没有思路
这道题不涉及太多的算法!主要就是对数组问题中边界条件的处理
结合二分法的两种情况!一个重要的概念就是:循环不变量!
就是要看,每次循环时,也就是一层循环中,区间的选择,最后会不会出现情况遗失或者多余情况重复循环!
经典的左闭右开和左开右闭!
结合本题的情况就是,如下图:注意到时拐角处的处理
代码:
1)左闭右开的情况,出现错误,在n为奇数时,最中间的内容会无法放入:
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
//有四种情况的添加方式
//a记录上边,b记录右边,c记录下边,d记录左边
int a = 0,b = n-1,c = n-1,d = 0;//最开始的外围记录
//以要添加的数字作为 判断标准,最开始是1,以n的平方结尾
int num = 1,target = n * n;
while(num <= target){
//每次进来依次添加四条边
//这样的方式为左闭右开
for(int i = d;i < b;i++) res[a][i] = num++;
for(int i = a;i < c;i++) res[i][b] = num++;
for(int i = b;i > d;i--) res[c][i] = num++;
for(int i = c;i > a;i--) res[i][d] = num++;
a++;
b--;
c--;
d++;
}
return res;
}
}
2)左开右闭的情况:正确的
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
//有四种情况的添加方式
//a记录上边,b记录右边,c记录下边,d记录左边
int a = 0,b = n-1,c = n-1,d = 0;//最开始的外围记录
//以要添加的数字作为 判断标准,最开始是1,以n的平方结尾
int num = 1,target = n * n;
while(num <= target){
//每次进来依次添加四条边
for(int i = d;i <= b;i++){
res[a][i] = num++;
}a++;
for(int i = a;i <= c;i++){
res[i][b] = num++;
}b--;
for(int i = b;i >= d;i--){
res[c][i] = num++;
}c--;
for(int i = c;i >= a;i--){
res[i][d] = num++;
}d++;
}
return res;
}
}