LeetCode59.螺旋矩阵
- 1.问题描述
- 2.解题思路
- 3.代码
1.问题描述
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
2.解题思路
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
3.代码
python:
from typing import Listclass Solution:def generateMatrix(self, n: int) -> List[List[int]]:nums = [[0] * n for _ in range(n)]startx, starty = 0, 0 # 起始点loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点count = 1 # 计数for offset in range(1, loop + 1): # 每循环一层偏移量加1,偏移量从1开始for i in range(starty, n - offset): # 从左至右,左闭右开nums[startx][i] = countcount += 1for i in range(startx, n - offset): # 从上至下nums[i][n - offset] = countcount += 1for i in range(n - offset, starty, -1): # 从右至左nums[n - offset][i] = countcount += 1for i in range(n - offset, startx, -1): # 从下至上nums[i][starty] = countcount += 1startx += 1 # 更新起始点starty += 1if n % 2 != 0: # n为奇数时,填充中心点nums[mid][mid] = countreturn numssolution = Solution()
result = solution.generateMatrix(5) # 传入想要生成的矩阵的大小
for row in result:print(row)
C++:
#include <iostream>
#include <vector>using namespace std;class Solution {public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组int startx = 0, starty = 0; // 定义每循环一个圈的起始位置int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)int count = 1; // 用来给矩阵中每一个空格赋值int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位int i,j;while (loop --) {i = startx;j = starty;// 下面开始的四个for就是模拟转了一圈// 模拟填充上行从左到右(左闭右开)for (j = starty; j < n - offset; j++) {res[startx][j] = count++;}// 模拟填充右列从上到下(左闭右开)for (i = startx; i < n - offset; i++) {res[i][j] = count++;}// 模拟填充下行从右到左(左闭右开)for (; j > starty; j--) {res[i][j] = count++;}// 模拟填充左列从下到上(左闭右开)for (; i > startx; i--) {res[i][j] = count++;}// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)startx++;starty++;// offset 控制每一圈里每一条边遍历的长度offset += 1;}// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值if (n % 2) {res[mid][mid] = count;}return res;}
};int main() {Solution s;int n;cout << "Enter the value of n: ";cin >> n;vector<vector<int>> matrix = s.generateMatrix(n);for (int i = 0; i < matrix.size(); i++) {cout << "[";for (int j = 0; j < matrix[i].size(); j++) {cout << matrix[i][j];if (j != matrix[i].size() - 1) {cout << ",";}}cout << "]";if (i != matrix.size() - 1) {cout << ",";}cout << endl;}return 0;
}