Leecode 59.螺旋矩阵II(画图分析)
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
解题思路:
- 初始化一个 n×n 大小的矩阵result ,然后模拟整个向内环绕的填入过程:
- 定义当前左右上下边界 left,top,right,bottom,初始值 currNum = 0
- 首先从左到右遍历,到右边界后,下面我们需要从下一行开始从上到下遍历,所以需要控制上边界,top++;
- 接着从上到下遍历,到下边界后,我们需要从左边的一列开始从右到左遍历,所以需要控制右边界, right--;
- 接着从右到左遍历,到左边界后,我们需要从上边的一行开始从下到上遍历,所以需要控制下边界,bottom--;
- 最后我们需要从上到下遍历,到上边界后,需要从右边的下一列开始从左到右开始遍历,所以需要控制左边界,left++;
重复以上操作,最后我们需要判断左边界是否大于右边界,下边界是否大于上边界
满足这两个条件,说明我们已经遍历完成,直接返回结果即可。
代码实现:
java
class Solution {
public int[][] generateMatrix(int n) {
int left = 0; // 左边界
int top = 0; // 上边界
int right = n - 1; // 右边界
int bottom = n - 1; // 下边界
int currNum = 0; // 当前填充的数字
int[][] result = new int[n][n]; // 结果矩阵
while(true){
// 从左到右填充数字
for(int i = left; i <= right; i++){
result[top][i] = ++currNum;
}
top++;
// 从上到下填充数字
for(int i = top; i <= bottom; i++){
result[i][right] = ++currNum;
}
right--;
// 从右到左填充数字
for(int i = right; i >= left; i--){
result[bottom][i] = ++currNum;
}
bottom--;
// 从下到上填充数字
for(int i = bottom; i >= top; i--){
result[i][left] = ++currNum;
}
left++;
// 判断是否完成遍历
if(left > right || top > bottom){
break;
}
}
return result;
}
}
python
class Solution:
def generateMatrix(self, n: int) -> list[list[int]]:
left, top = 0, 0 # 左边界和上边界
right, bottom = n - 1, n - 1 # 右边界和下边界
curr_num = 0 # 当前填充的数字
result = [[0] * n for _ in range(n)] # 结果矩阵
while True:
# 从左到右填充数字
for i in range(left, right + 1):
curr_num += 1
result[top][i] = curr_num
top += 1
# 从上到下填充数字
for i in range(top, bottom + 1):
curr_num += 1
result[i][right] = curr_num
right -= 1
# 从右到左填充数字
for i in range(right, left - 1, -1):
curr_num += 1
result[bottom][i] = curr_num
bottom -= 1
# 从下到上填充数字
for i in range(bottom, top - 1, -1):
curr_num += 1
result[i][left] = curr_num
left += 1
# 判断是否完成遍历
if left > right or top > bottom:
break
return result
c++
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int left = 0, top = 0; // 左边界和上边界
int right = n - 1, bottom = n - 1; // 右边界和下边界
int currNum = 0; // 当前填充的数字
vector<vector<int>> result(n, vector<int>(n, 0)); // 结果矩阵
while (true) {
// 从左到右填充数字
for (int i = left; i <= right; i++) {
result[top][i] = ++currNum;
}
top++;
// 从上到下填充数字
for (int i = top; i <= bottom; i++) {
result[i][right] = ++currNum;
}
right--;
// 从右到左填充数字
for (int i = right; i >= left; i--) {
result[bottom][i] = ++currNum;
}
bottom--;
// 从下到上填充数字
for (int i = bottom; i >= top; i--) {
result[i][left] = ++currNum;
}
left++;
// 判断是否完成遍历
if (left > right || top > bottom) {
break;
}
}
return result;
}
};
评论区