网站建设4000-262-263,网站上设置返回首页的超链接咋做的,天津建设工程,网站百度搜不到【力扣】59. 螺旋矩阵 II
给你一个正整数 n n n #xff0c;生成一个包含 1 到 n 2 n^2 n2 所有元素#xff0c;且元素按顺时针顺序螺旋排列的 n n n n nn 正方形矩阵 m a t r i x matrix matrix 。
示例 1#xff1a;
输入#xff1a;n 3 输出#xff1a;[[1,…【力扣】59. 螺旋矩阵 II
给你一个正整数 n n n 生成一个包含 1 到 n 2 n^2 n2 所有元素且元素按顺时针顺序螺旋排列的 n × n n × n n×n 正方形矩阵 m a t r i x matrix matrix 。
示例 1
输入n 3 输出[[1,2,3],[8,9,4],[7,6,5]]
示例 2 输入n 1 输出[[1]]
提示 1 n 20
题解
注意每一循环一圈的时候注意循环不变量原则
上行从左到右 (左闭右开)右列从上到下 (左闭右开)下行从右到左 (左闭右开)左列从下到上 (左闭右开)
public class Main {public int[][] generateMatrix(int n) {int[][] res new int[n][n];// 定义每循环一个圈的起始位置int startx 0, starty 0;// 每个圈循环几次例如 n为奇数 3那么loop 1 只是循环一圈矩阵中间的值需要单独处理int loop n / 2;// 矩阵中间的位置例如n为 3 中间的位置就是(11)n为5中间位置为(2, 2)int mid n / 2;// 用来计数赋值int count 1;// 需要控制每一条边遍历的长度每次循环右边界收缩一位int offset 1;int i, j;while ((loop--) 0) {i startx;j starty;// 模拟填充上行从左到右(左闭右开)for (j starty; j n - offset; j) {res[i][j] count;}// 模拟填充右列从上到下(左闭右开)for (i startx; i n - offset; i) {res[i][j] count;}// 模拟填充下行从右到左(左闭右开)for (; j starty; j--) {res[i][j] count;}// 模拟填充左列从下到上(左闭右开)for (; i startx; i--) {res[i][j] count;}// 第二圈开始的时候起始位置要各自加1 例如第一圈起始位置是(0, 0)第二圈起始位置是(1, 1)startx;starty;// offset 控制每一圈里每一条边遍历的长度offset 1;}// 如果n为奇数的话需要单独给矩阵最中间的位置赋值if ((n % 2) 1) {res[mid][mid] count; //res[startx][starty] count;}return res;}
}