程式碼隨想錄演算法訓練營第二天 | 陣列 59.螺旋矩陣

小鹿BAMBI發表於2024-04-06

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 

相關文章