[0059.螺旋矩阵II
class Solution {
public int[][] generateMatrix(int n) {
int count = 1;
int [][] res = new int [n][n];
int loop = n / 2;
int stari = 0;
int starj = 0;
int i = 0;
int j = 0;
while (loop > 0){
for (j = starj; j < n - loop; j++ ) {
res[i][j] = count++;
}
for (i = stari; i < n - loop; i++ ) {
res[i][j] = count++;
}
for (; j > n - loop; j--){
res[i][j] = count++;
}
for (; i < n - loop; i--){
res[i][j] = count++;
}
loop--; //我这里认为while(0)不进入循环
starj++;
stari++;
}
if (n % 2 != 0){
res[i][j] = count++;
}
return res;
}
}
- loop没理解对,导致从左到右、从上到下都赋值没问题,但从右到左、从下到上出问题了。。本题螺旋形状赋值,不仅要关注区间上的左闭右开,还要关注行列下表i、j谁静谁动。画个图具体代值更清晰一点。
class Solution {
public int[][] generateMatrix(int n) {
int count = 1;
int [][] res = new int [n][n];
int loop = n / 2;
int stari = 0;
int starj = 0;
int i = 0;
int j = 0;
while (loop > 0){
for (j = starj; j < n - loop; j++ ) {
res[i][j] = count++;
}
for (i = stari; i < n - loop; i++ ) {
res[i][j] = count++;
}
for (; j > loop - 1; j--){
res[i][j] = count++;
}
for (; i > loop -1; i--){
res[i][j] = count++;
}
loop--; //我这里认为while(0)不进入循环
starj++;
stari++;
}
if (n % 2 != 0){
res[stari][stari] = count++;
}
return res;
}
}
- 问题多多,和随想录比较了一下,for循环处有区别,听了一下视频课,短短几分钟竟然听着听着就神游了,还差点睡着了~~不过还好,我get到了问题所在
class Solution {
public int[][] generateMatrix(int n) {
int count = 1; //元素值
int [][] res = new int [n][n]; //数组创建
int loop = n / 2; //圈数
int length = 1; //跟n一起控制每边长度
int stari = 0; //每圈下标 i的起始位置
int starj = 0; //每圈下标j的起始位置
int i = 0;
int j = 0;
while (loop > 0){ //每一次循环就是一圈
j = starj;
i = stari;
for (; j < n - length; j++ ) { //第一条边从左到右先闭后开进行赋值
res[i][j] = count++;
}
for (; i < n - length; i++ ) { //第二条边从上到下先闭后开进行赋值
res[i][j] = count++;
}
for (; j > starj; j--) { //第三条边从右到左先闭后开进行赋值
res[i][j] = count++;
}
for (; i > stari; i-- ){ //第四条边从下到上先闭后开进行赋值
res[i][j] = count++;
}
loop--; //一圈结束
length++; //边长变小
starj++; //初始位置移动
stari++;
}
if (n % 2 != 0){ //当n不为偶数时需要给中间元素 也就是最后留下的一个元素专门赋值
res[stari][starj] = count++;
}
return res;
}
}
- 圈数是和边长挂钩,但还是最好单独设置一个变量length把边长表示出来,而不是借助n-loop,否则n变了,loop也会随之变,那么n-loop不一定就是想要的那个数,这关系不是线性那么简单,上个代码n=3能跑通 n=4不能跑通,原因就是在这。
明天继续:)