要如何画出这个螺旋排列的正方形矩阵呢?
要写出正确的螺旋矩阵一定要坚持循环不变量原则。
要在螺旋矩阵的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
而求解本题依然是要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
由外向内一圈一圈这么画下去。
可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人。
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
思想
public static int[][] generateMatrix(int n) {
int[][] a = new int[n][n];
int jishuqi = 1;
int i = 0, j = 0;//cishu代表每一轮该走几步 i代表行 j代表列
int cihsu = n - 1;
while (jishuqi <= n * n) {
for (int k = cihsu; k > 0; k--){
a[i][j] = jishuqi;
jishuqi++;
j++;
}
for (int k = cihsu; k > 0; k--) {
a[i][j] = jishuqi;
jishuqi++;
i++;
}
for (int k = cihsu; k > 0; k--) {
a[i][j] = jishuqi;
jishuqi++;
j--;
}
for (int k = cihsu; k > 0; k--) {
a[i][j] = jishuqi;
jishuqi++;
i--;
}
i++;j++;
cihsu--;
cihsu--;
if(jishuqi > n * n) {
return a;
}
if(cihsu<0)
{
if (n % 2 == 1) {//n为单数,需要给中心最后一个数填值
a[n/2][n/2] = jishuqi;
}
return a;
}
}
return a;
}