代码随想录笔记_数组
代码随想录二刷笔记记录
LC59.螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
本题主要考察矩阵模拟,可以在纸上画一遍较为清晰
需要注意循环不变量的处理
分析:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
即:
1 2 3
8 9 4
7 6 5
n = 4 则为 n = 5 则为
1 2 3 4 1 2 3 4 5
12 13 14 5 16 17 18 19 6
11 16 15 6 15 24 25 20 7
10 9 8 7 14 23 22 21 8
13 12 11 10 9
模拟顺时针矩阵(以n=3为例)
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
完整代码
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
if (n == 1){
res[0][0] = 1;
return res;
}
//上下左右 下标
int up = 0;
int down = n-1;
int left = 0;
int right = n-1;
//数字数量
int limit = n*n;
//记录数字的增长,不能超过 limit
int cnt = 1;
while (cnt <= limit){
//循环不变量:左闭右闭区间
for (int i = left; i <= right; i++) {
res[up][i] = cnt++;
}
up++;
for (int i = up; i <= down; i++) {
res[i][right] = cnt++;
}
right--;
for (int i = right; i >= left ; i--) {
res[down][i] = cnt++;
}
down--;
for (int i = down; i >= up; i--) {
res[i][left] = cnt++;
}
left++;
}
return res;
}