59. 螺旋矩阵 II:
给你一个正整数 n
,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
样例 1:
文章来源:https://www.toymoban.com/news/detail-510767.html
输入:
n = 3
输出:
[[1,2,3],[8,9,4],[7,6,5]]
样例 2:
输入:
n = 1
输出:
[[1]]
提示:
- 1 <= n <= 20
分析:
- 面对这道算法题目,二当家的再次陷入了沉思。
- 可以每次循环移动一步,判断移到边界就变换方向,巧用数组可以减少逻辑判断的复杂性。
- 也可以每次循环都换完4次方向,也就是完成一次顺时针,然后缩圈,就像剥洋葱一样,一层一层的从外向内,非常好理解。
- 和 54. 螺旋矩阵 非常类似,但是之前是读,而现在相当于是写。
- 边界的判断和边界的缩小依然是关键。
- 一个方向的最后位置,同样可以作为下一个方向的开始值,要当心不要重复,方法是一样的,只是细节上有差异。
- 相对来说,按层的方式,一次遍历完成一个顺时针比较直观,逻辑更加清晰,不容易出错,每次遍历都完成相同的内容。
- 每次循环完成一步的方式,要有个状态切换的问题,把握不准容易出错。
题解:
rust:
impl Solution {
pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> {
let mut ans = vec![vec![0; n as usize]; n as usize];
let mut num = 0;
let (mut left, mut right, mut top, mut bottom) = (0, n as usize - 1, 0, n as usize - 1);
while left <= right && top <= bottom {
(left..right + 1).for_each(|column| {
num += 1;
ans[top][column] = num;
});
(top + 1..bottom + 1).for_each(|row| {
num += 1;
ans[row][right] = num;
});
if left < right && top < bottom {
(left..right).rev().for_each(|column| {
num += 1;
ans[bottom][column] = num;
});
(top + 1..bottom).rev().for_each(|row| {
num += 1;
ans[row][left] = num;
});
}
if right == 0 || bottom == 0 {
break;
}
left += 1;
right -= 1;
top += 1;
bottom -= 1;
}
return ans;
}
}
go:
func generateMatrix(n int) [][]int {
ans := make([][]int, n)
for i := range ans {
ans[i] = make([]int, n)
}
num := 0
left, right, top, bottom := 0, n-1, 0, n-1
for left <= right && top <= bottom {
for column := left; column <= right; column++ {
num++
ans[top][column] = num
}
for row := top + 1; row <= bottom; row++ {
num++
ans[row][right] = num
}
if left < right && top < bottom {
for column := right - 1; column >= left; column-- {
num++
ans[bottom][column] = num
}
for row := bottom - 1; row > top; row-- {
num++
ans[row][left] = num
}
}
left++
right--
top++
bottom--
}
return ans
}
c++:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n));
int num = 0;
int left = 0, right = n - 1, top = 0, bottom = n - 1;
while (left <= right && top <= bottom) {
for (int column = left; column <= right; ++column) {
ans[top][column] = ++num;
}
for (int row = top + 1; row <= bottom; ++row) {
ans[row][right] = ++num;
}
if (left < right && top < bottom) {
for (int column = right - 1; column >= left; --column) {
ans[bottom][column] = ++num;
}
for (int row = bottom - 1; row > top; --row) {
ans[row][left] = ++num;
}
}
++left;
--right;
++top;
--bottom;
}
return ans;
}
};
python:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
ans = [[0] * n for _ in range(n)]
num = 0
left, right, top, bottom = 0, n - 1, 0, n - 1
while left <= right and top <= bottom:
for column in range(left, right + 1):
num += 1
ans[top][column] = num
for row in range(top + 1, bottom + 1):
num += 1
ans[row][right] = num
if left < right and top < bottom:
for column in range(right - 1, left - 1, -1):
num += 1
ans[bottom][column] = num
for row in range(bottom - 1, top, -1):
num += 1
ans[row][left] = num
left, right, top, bottom = left + 1, right - 1, top + 1, bottom - 1
return ans
java:
class Solution {
public int[][] generateMatrix(int n) {
final int[][] ans = new int[n][n];
int num = 0;
int left = 0, right = n - 1, top = 0, bottom = n - 1;
while (left <= right && top <= bottom) {
for (int column = left; column <= right; ++column) {
ans[top][column] = ++num;
}
for (int row = top + 1; row <= bottom; ++row) {
ans[row][right] = ++num;
}
if (left < right && top < bottom) {
for (int column = right - 1; column >= left; --column) {
ans[bottom][column] = ++num;
}
for (int row = bottom - 1; row > top; --row) {
ans[row][left] = ++num;
}
}
++left;
--right;
++top;
--bottom;
}
return ans;
}
}
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~文章来源地址https://www.toymoban.com/news/detail-510767.html
到了这里,关于算法leetcode|59. 螺旋矩阵 II(rust重拳出击)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!