螺旋矩阵问题模板
螺旋矩阵代码模板。这种问题没有什么算法,但是很考验功力。
螺旋矩阵
例题:Loading Question... - 力扣(LeetCode) (leetcode-cn.com)
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
循环不变量
这里要按圈来分析,对于每一圈,需要遍历四条边:
- 上行从左到右
- 右列从上到下
- 下行从右到左
- 左列从下到上
这里要遵循左闭右开原则,如下图:
代码模板
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
// 循环次数
// 圈数,对于 n = 3 ,则需要循环 n / 2 = 1 圈
// 对于 n 为奇数时 中心点 最后单独填充
int loop = n/2;
// 每次循环起始位置
int startX = 0;
int startY = 0;
// 偏移量
int offset = 1;
// 填充数字
int count = 1;
// 定义中间位置
int mid = n/2;
while (loop > 0) {
int i = startX;
int j = startY;
// 上行从左到右
for(; j < startY + n - offset; ++ j){
res[i][j] = count ++;
}
// 右列从上到下
for(; i < startX + n - offset; ++ i){
res[i][j] = count ++;
}
// 下行从右到左
for(; j > startY ; --j){
res[i][j] = count ++;
}
// 左侧从下到上
for(; i > startX ; --i){
res[i][j] = count ++;
}
loop --;
startX += 1;
startY += 1;
offset += 2;
}
if(n % 2 == 1){
res[mid][mid] = count;
}
return res;
}
}