LeetCode 59. 螺旋矩阵 II
题目描述
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
css
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/spiral-matrix-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
按照螺旋矩阵模拟即可,先从左到右,在从上到下,再从右到左,再从下到上。
每次进行cur++
操作,直到累加到total
为止。最后返回二维数组即可(没想到 js
二维数组也是这样方便...)
javascript
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function (n) {
let top = 0,
bottom = n - 1;
let left = 0,
right = n - 1;
let res = [];
for (let i = 0; i < n; i++) res[i] = [];
let cur = 1,
total = n * n;
while (cur <= total) {
for (let i = left; i <= right; i++) res[top][i] = cur++; // 从左到右
top++;
for (let i = top; i <= bottom; i++) res[i][right] = cur++; // 从上到下
right--;
for (let i = right; i >= left; i--) res[bottom][i] = cur++; // 从右到左
bottom--;
for (let i = bottom; i >= top; i--) res[i][left] = cur++; // 从下到上
left++;
}
return res;
};
cpp
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int top = 0, bottom = n - 1;
int left = 0, right = n - 1;
int cur = 1, total = n * n;
while (cur <= total) {
for (int i = left; i <= right; i++) res[top][i] = cur++; // 从左到右
top++;
for (int i = top; i <= bottom; i++) res[i][right] = cur++; // 从上到下
right--;
for (int i = right; i >= left; i--) res[bottom][i] = cur++; // 从右到左
bottom--;
for (int i = bottom; i >= top; i--) res[i][left] = cur++; // 从下到上
left++;
}
return res;
}
};
java
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int top = 0, bottom = n - 1;
int left = 0, right = n - 1;
int cur = 1, total = n * n;
while (cur <= total) {
for (int i = left; i <= right; i++) res[top][i] = cur++; // 从左到右
top++;
for (int i = top; i <= bottom; i++) res[i][right] = cur++; // 从上到下
right--;
for (int i = right; i >= left; i--) res[bottom][i] = cur++; // 从右到左
bottom--;
for (int i = bottom; i >= top; i--) res[i][left] = cur++; // 从下到上
left++;
}
return res;
}
}
python
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res = [[0] * n for _ in range(n)]
top, bottom = 0, n - 1
left, right = 0, n - 1
cur, total = 1, n * n
while cur <= total:
for i in range(left, right + 1): res[top][i] = cur; cur += 1 # 从左到右
top += 1
for i in range(top, bottom + 1): res[i][right] = cur; cur += 1 # 从上到下
right -= 1
for i in range(right, left - 1, -1): res[bottom][i] = cur; cur += 1 # 从右到左
bottom -= 1
for i in range(bottom, top - 1, -1): res[i][left] = cur; cur += 1 # 从下到上
left += 1
return res
javascript
学如逆水行舟,不进则退