题目
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix [59. 螺旋矩阵 II](leetcode.cn/problems/sp…)
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
思路
这道题目没有什么特殊的技巧,按照顺时针的方式填充矩阵的数据。顺时针分为四条边,我们需要挨个处理这四个边。在每一轮循环中,我们按照从左往右、从上往下、从右往左、从下往上的顺序依次填充矩阵的每一行或每一列。
变量定义
- rowStart。用于记录每一次顺时针开始时,矩阵行开始的地方。
- rowEnd。用于记录每一次顺时针开始时,矩阵行结束的地方。
- colStart。用于记录每一次顺时针开始时,矩阵列开始的地方。
- colEnd。用于记录每一次顺时针开始时,矩阵列结束的地方。
- count。用于记录填充的数据。
处理细节
从左往右,不变的是rowStart(行),变动的是列。在for循环中完成填充之后为下一次的从上往下准备rowStart++;从上往下,不变的是colEnd(列),变动的是行。在for循环中完成填充之后为下一次的从右往左准备colEnd--;从右往左,不变的是rowEnd(行),变动的是列。在for循环中完成填充之后为下一次的从下往上准备rowEnd--;从下往上,不变的是colStart(列),变动的是行。在for循环中完成填充之后为下一次的从上往下准备colStart++;
代码
package leetcode;
public class GenerateMatrix59 {
public static void main(String[] args) {
int[][] arr = generateMatrix(3);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int rowStart = 0;
int rowEnd = n - 1;
int colStart = 0;
int colEnd = n - 1;
int count = 1;
while (rowStart <= rowEnd && colStart <= colEnd) {
//从左往右
for (int i = colStart; i <= colEnd; i++) {
res[rowStart][i] = count++;
}
rowStart++;
//从上往下
for (int i = rowStart; i <= rowEnd; i++) {
res[i][colEnd] = count++;
}
colEnd--;
//从右往左
for (int i = colEnd; i >= colStart; i--) {
res[rowEnd][i] = count++;
}
rowEnd--;
//从下往上
for (int i = rowEnd; i >= rowStart; i--) {
res[i][colStart] = count++;
}
colStart++;
}
return res;
}
}