这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战
前言
力扣第五十九题 螺旋矩阵 II
如下所示:
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: n = 1
输出: [[1]]
一、思路
螺旋矩阵 II
和 力扣第五十四题-螺旋矩阵 是非常像的,实现的思路都很类似,有兴趣的也可以看一下那一题。
题目中共告诉了我们两个重要的信息:
- 矩阵大小为
n x n
- 填充矩阵的顺序为
→
、↓
、←
、↑
,起始值为1
结束值为n x n
既然我们都已经知道了矩阵的大小和它填充的顺序,那么我们就可以模拟这一过程。大致的步骤如下所示:
- 初始化一个
n x n
的空矩阵 - 从外圈向内圈填充(长度为
n
的矩阵共有(n+1)/2
个圈) - 填充的顺序为
→
、↓
、←
、↑
圈的定义
圈是一个抽象的概念(便于理解),实际上对于奇数长度的矩阵,它的最内圈只有一个元素,但我们依然称之为一个圈。主要是为了指明在填充过程中需要对圈中的元素进行 →
、↓
、←
、↑
的填充。
圈的个数就是指从外向内有多少个圈,如下图 5 x 5
的矩阵共有 3
个圈
举个例子
此处以填充 5 x 5
矩阵的第一个圈(最外圈)作为例子
→
从左向右处理第1
个圈的元素,即填充[0][0~4]
↓
从上向下处理第1
个圈的元素,即填充[4][1~4]
←
从右向左处理第1
个圈的元素,即填充[4][3~0]
↑
从下向上处理第1
个圈的元素,即填充[3~1][0]
二、实现
实现代码
实现代码与思路中保持一致,如下所示:
public int[][] generateMatrix(int n) {
int[][] ret = new int[n][n]; // 结果集
int i = 0;
// 共有多少个圈(如果为奇数会多一圈)
int count = (n + 1) / 2;
int currentVal = 1;
// 从外部向内逐层遍历
while(i < count) {
// 向左
for (int j = i; j < n-i; j++) {
ret[i][j] = currentVal;
currentVal++;
}
// 向下
for (int j = i+1; j < n-i; j++) {
ret[j][(n-1)-i] = currentVal;
currentVal++;
}
// 向左
for (int j = (n-1)-(i+1); j >= i && (n-1-i != i); j--) {
ret[(n-1)-i][j] = currentVal;
currentVal++;
}
// 向上
for (int j = (n-1)-(i+1); j >= i+1 && (n-1-i) != i; j--) {
ret[j][i] = currentVal;
currentVal++;
}
i++;
}
return ret;
}
测试代码
public static void main(String[] args) {
new Number59().generateMatrix(5);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥