这里一定要坚持循环不变量原则(就像之前的二分查找要坚持左闭右开一样):
这里画矩阵的时候要保证每次画四条边的时候,每一条边的元素数量都要保证一样,如图所示,其中橙色表示第一次循环,蓝色表示第二次循环。
随后如果n是奇数,最中间还会留下一个空缺,只要最后额外填充一下就可以了
public static int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int startX = 0;
int startY = 0;
int offset = 1;
int count = 1; //实际要插入的数字
for (int i = 0; i < n / 2; i++) {
startX = i;
for (int x = startX; x < n - offset; x++) {
nums[startX][x] = count++;
}
startY = i;
for (int y = startY; y < n - offset; y++) {
nums[y][n - 1 - startY] = count++;
}
startX = n - 1 - i;
for (int x = startX; x > i; x--) {
nums[startX][x] = count++;
}
startY = n - 1 - i;
for (int y = startY; y > i; y--) {
nums[y][n - 1 - startY] = count++;
}
offset++;
}
if (n % 2 != 0) {
nums[n / 2][n / 2] = n * n;
}
return nums;
}