以1 2 3 4 5 6 7 8 9为例
n=奇数
结果
1 2 3 i
8 9 4
7 6 5
j
循环次数 | 循环内次数 | 结果 | 对应坐标 | i | j |
1 | 1 | 1,2 | (0,0)(1,0) | 0-1 | 0 |
1 | 2 | 3,4 | (2,0)(2,1) | 2 | 0-1 |
1 | 3 | 5,6 | (2,2)(1,2) | 2-1 | 2 |
1 | 4 | 7,8 | (0,2)(0,1) | 0 | 2-1 |
2 | 1 | 9 | (1,1)i==j(终止) | 1 | 1 |
以及
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
n=偶数
结果
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
循环次数 | 循环内次数 | 结果 | i | j |
1 | 1 | 1,2,3 | 0-2 | 0 |
1 | 2 | 4,5,6 | 3 | 0-2 |
1 | 3 | 7,8,9 | 3-1 | 3 |
1 | 4 | 10,11,12 | 0 | 3-1 |
2 | 1 | 13 | 1 | 1 |
2 | 2 | 14 | 2 | 1 |
2 | 3 | 15 | 2 | 2 |
2 | 4 | 16 j=1+1(终止) | 1 | 2 |
除终止条件不同
其他可发现在一次循环内(在第一次循环时start=0,end=length-1)
第一次 for i start-end-1 and j=start
第二次 for j start-end-1 and i=end
第三次 for i end-start+1 and j=end
第四次 for j end-start+1 and i=start
循环之间
start++,end--
但是要区分n的奇数和偶数
n=奇数,如果跟偶数一样处理,则会使最后一个值重复四次
if(start==end) (只有奇数才能做到)
填充最后一个数
终止
if n=偶数
if start>end
终止
同时要处理特殊n==1时
要将终止判断放到循环头
代码
class Solution {
public int[][] generateMatrix(int n) {
int[][] mat = new int[n][n];
int index=1;
int start=0,end=n-1;
int i,j;
while(true)
{
if(start==end)
{
mat[start][end]=index++;
break;
}
else if(start>end)
{
break;
}
for(i=start;i<=end-1;i++)
{
mat[start][i]=index++;
}
for(j=start;j<=end-1;j++)
{
mat[j][end]=index++;
}
for(i=end;i>=start+1;i--)
{
mat[end][i]=index++;
}
for(j=end;j>=start+1;j--)
{
mat[j][start]=index++;
}
end--;
start++;
}
return mat;
}
}
标签:java,mat,start,int,++,II,59,循环,end
From: https://blog.csdn.net/weixin_73376914/article/details/143717124