Python練習-LeetCode 第1篇 順時針列印矩陣

K0z_zky發表於2020-10-11

Python練習-LeetCode 第1篇

題目

第一次使用LeetCode,感覺還挺不錯的,在這裡寫簡單的一個演算法題題解:
劍指offer題之 順時針列印矩陣

中文題目
還有英文版的,適合練一下英語,這裡就不放了。


解題思路

順時針列印矩陣,也稱為螺旋昇天列印演算法。
演算法比較簡單,我太菜,想不到什麼特別簡單的演算法,大概思路如下:

#虛擬碼
top = 0
left = 0
bottom = len(矩陣行) -1
right = len(矩陣列) -1
res = []
while true:
	for 遍歷矩陣頂部
	top++
	if top>bottom: break
	for 遍歷矩陣右邊
	right--
	if left>right: break
	for 遍歷矩陣底部
	bottom --
	if top>bottom: break
	for 遍歷矩陣左部
	left ++ 
	if left>right: break
print(res)

用圖表示為下圖:
每次遍歷一條矩陣的邊,遍歷完了就跳出迴圈

圖片表示

程式碼

在這裡就不展示矩陣類和生成函式了,直接寫迴圈的函式程式碼,如下所示:

class Solution:
    def spiralOrder(self, matrix:[[int]]) -> [int]:
        if len(matrix) ==0: 
            return []
        
        l = 0 #左邊
        r = len(matrix[0]) - 1 #右邊 這裡需要減一
        t = 0 #上邊
        b = len(matrix) - 1 #下邊
        res = [] #結果列表

        while True:
            for i in range(l, r + 1): 
                res.append(matrix[t][i]) # left to right
            t += 1
            if t > b: 
                break
            for i in range(t, b + 1): 
                res.append(matrix[i][r]) # top to bottom
            r -= 1
            if l > r: 
                break
            for i in range(r, l - 1, -1): 
                res.append(matrix[b][i]) # right to left
            b -= 1
            if t > b: 
                break
            for i in range(b, t - 1, -1): 
                res.append(matrix[i][l]) # bottom to top
            l += 1
            if l > r: 
                break
        return res
     

有的小夥伴要問了,在開始的定義的時候,為什麼要減一呢?
好問題!
因為在後面的while 迴圈中,可以很清楚的看到,如果不減一,那麼為了正常輸出,在圈出的位置要改為r
(r+1 =》 r)

而這樣的話會導致矩陣四個角的位置會錄入結果列表res兩次。
所以為了避免這種情況需要做出一個調整。
當然也可以在第二個for迴圈中
的 t 改為 t + 1
都是一個意思,就不多說了。
在這裡插入圖片描述

總結

總而言之,對於初學者而言,還是比較友好的。(對於我這種大三菜雞)

相關文章