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;
}