leetcode 59.螺旋矩陣
題目
59.螺旋矩陣
給你一個正整數 n ,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。
解題思路
構建一個n行n列的二維陣列
計算轉幾圈(注意n為奇數時,轉圈結束後會剩餘一箇中心點)
填充每圈的數值 --最外層迴圈
每圈按四條邊進行賦值,從左到右、從上到下、從右到左、從下到上 --在外側迴圈內套四個迴圈,一條邊用一個迴圈
關鍵點:所有迴圈的邊界點 統一使用 左閉右開
實現程式碼
from typing import List
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
# 構建一個n行n列的二維陣列
nums = [[0] * n for _ in range(n)]
# 定義矩陣的起始點 --起始位置每一圈都會變化,所以要用變數定義起始位置
startx, starty = 0, 0
# 定義迴圈次數
loop = n // 2
# 如果n是奇數,迴圈後會剩餘一箇中心點
# 比如n=3,轉一圈後剩餘中心點nums[1,1]; n=5 中心點nums[2,2]
# 當n是奇數時,轉loop圈後剩餘中心點nums[mid, mid]要單獨賦值
mid = n // 2
if n %2 == 1:
nums[mid][mid] = n ** 2
# 每迴圈一圈,起始點就會偏移,偏移量從1開始
# 不轉圈和轉1圈時,起始點都不偏移,轉2圈時起始點從[0,0]偏移為[1,1]
'''
n = 1, loop = 0, startx, starty = 0,0
n = 2, loop = 1, startx, starty = 0,0
n = 3, loop = 1, startx, starty = 0,0
n = 4, loop = 2, 第一圈 startx, starty = 0,0 第二圈 startx, starty = 1,1
'''
value = 1
for offset in range(1, loop + 1): # 起始點的偏移量從1開始
'''
假設n = 4, loop = 2, for offset in range(1,3) --offset的值為1,2
for i in range(0,3) i=0,1,2
迴圈第一圈
從左到右,左閉右開
startx, starty = 0, 0
value = 1
i = 0, nums[0][0] = 1
value = 2
i = 1, nums[0][1] = 2
value = 3
i = 2, nums[0][2] = 3
從上到下
從右到左
從下到上
迴圈第二圈
startx, starty = 1, 1
......
'''
for i in range(starty, n - offset): # 從左到右 nums[0][0]、nums[0][1]、nums[0][2]
nums[startx][i] = value
value += 1
for i in range(startx, n - offset): # 從上到下 nums[0][3]、nums[1][3]、nums[2][3]
nums[i][n - offset] = value
value += 1
for i in range(n - offset, starty, -1): # 從右到左 nums[3][3]、nums[3][2]、nums[3][1]
nums[n - offset][i] = value
value += 1
for i in range(n - offset, startx, -1): # 從下到上 nums[3][0]、nums[2][0]、nums[1][0]
nums[i][startx] = value
value += 1
startx += 1
starty += 1
return nums
test = Solution()
print(test.generateMatrix(4)) # [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
本題涉及的python基礎知識
# 1、構造二維矩陣 使用列生成表示式 list = [表示式 for 變數 in 範圍 if 條件]
n = 3
arr = [[0] * n for _ in range(n)]
# [0] * n 表示陣列重複n次並依次連線形成一個新陣列
# for _ in range(n) 等效於for i in range(n) 將迴圈執行n次 _在後面不會用到,是個佔位符
print(arr) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# 建立一個3行4列陣列
nums = [[0] * 4 for _ in range(3)]
# 給指定行和列給單個元素賦值 給第一行的4個列分別賦值
nums[0][0] = 1
nums[0][1] = 2
nums[0][2] = 3
nums[0][3] = 4
print(nums) # [[1, 2, 3, 4], [0, 0, 0, 0], [0, 0, 0, 0]]
# 整行賦值
nums[0] = [1,2,3,4]
nums[1] = [5,6,7,8]
nums[2] = [9,10,11]
print(nums)
# 2、倒序取值
for i in range(4, 0, -1):
print(i) # 4 3 2 1