1-1:题目描述
Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order.
Example 1:
Input: n = 3
Output: [[1,2,3],[8,9,4],[7,6,5]]
Example 2:
Input: n = 1
Output: [[1]]
Constraints:
1 <= n <= 20
题目理解:
比较好理解哈,按这个顺序去填写一个正方形数组。
1-2:解法
不涉及什么算法,单纯的用代码去模拟填充数组的这样一个思路。根据正常的逻辑,应该是按四条边,从外向里,从左到右,从上到下。如图:每次我们都提前算好一轮每条边上要遍历的值的数目。startX,startY分别是每一轮开始的坐标,比如第一轮startX=startY=0,第二轮startX=startY=1。这样我们就可以控制每一回的起点,方向,每天边遍历的数目啦!代码如下:
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int startX = 0; // 每次开始的x的坐标
int startY = 0; // 每次开始的y的坐标
int count = 1; // 从1~n^2
int number = n - 1; // 每一行的个数
while (count < n * n) {
int i = startX;
int j = startY;
for (; j < startY + number; j++) {
result[startX][j] = count++;
}
for (; i < startX + number; i++) {
result[i][j] = count++;
}
for (; j > startX; j--) {
result[i][j] = count++;
}
for (; i > startY; i--) {
result[i][j] = count++;
}
startX++;
startY++;
number -= 2;
}
if (n % 2 == 1) {
result[n / 2][n / 2] = n * n;
}
return result;
}
需要注意的是
- 下和左,这两条边的边界控制,用startX和startY控制好。
- 这里的这种边的处理方法,中心位置得最后处理。