文章目录
- 螺旋矩阵
- 解题思路
螺旋矩阵
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
解题思路
模拟这个螺旋过程。
- 初始化数组
- 确定循环次数,loop = n / 2;
- 循环时,奇数的中间值需要特殊处理
- startx,starty,用于确定每一次循环的起始点
- offset,用于减少每一次循环的此处
- mid,用于处理中间值
终点:**循环不变量,**每一次循环遵循左闭右开的原则。
分为
- 最上方从左往右
- 最右方从上往下
- 最下方从右往左
- 最左方从下往上
详细代码如下:
class Solution {
public int[][] generateMatrix(int n) {
//保证循环不变量的操作
int startx = 0 ,starty = 0;
int result[][] = new int[n][n]; //初始化数组
int loop = n / 2; //循环次数,奇数时,中间值需要特殊处理。
int mid = n / 2; //中间值
int i,j; //用于循环
int offset = 1; //用于减少每一次的循环次数
int count = 1; //用于赋值
while(loop-- > 0){ //循环次数
//最上方从左往右
for(j = starty; j < n - offset; j++){
result[startx][j] = count++;
}
//最右方从上往下
for(i = startx;i < n- offset;i++){
result[i][j] = count++;
}
//最下方从右往左
for(;j > starty;j--){
result[i][j] = count++;
}
//最左方从下往上
for(;i > startx;i--){
result[i][j] = count++;
}
startx++; //设置下一次的起始点
starty++; //设置下一次的起始点
offset++; //设置下一次的循环次数
}
//如果为奇数,中间值,特殊处理
if(n % 2 == 1){
result[mid][mid] = count;
}
return result;
}
}
我是小辉,24 届毕业生。当下是找工作ing,欢迎关注,持续分享。