模擬應用: 順時針迴旋路徑 Spiral Matrix III_Leetcode #885

模擬應用: 順時針迴旋路徑 Spiral Matrix III_Leetcode #885

更新於 發佈於 閱讀時間約 6 分鐘

題目敘述:

給定一個二維陣列的高與寬,並且給定起點位置座標。

請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。

以陣列的形式返回答案。


測試範例

Example 1:

raw-image
Input: rows = 1, cols = 4, rStart = 0, cStart = 0
Output: [[0,0],[0,1],[0,2],[0,3]]


Example 2:

raw-image
Input: rows = 5, cols = 6, rStart = 1, cStart = 4
Output: [[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]

約束條件

Constraints:

  • 1 <= rows, cols <= 100

陣列的高和寬都介於1~100之間。

  • 0 <= rStart < rows

起點的row一定是合法位置。

  • 0 <= cStart < cols

起點的column一定是合法位置。


演算法 模擬順時針走法

raw-image


順時針拜訪方向固定是往右,往下,往左,往上


初始step步伐為一步。


進入迴圈

接著往右step步,往下step步。

step 累加多一步

接著往左step步,往上step步。

step 累加多一步

...如此反覆循環,一直到拜訪所有陣列的格子點為止。


程式碼 模擬順時針走法

class Solution():

def spiralMatrixIII(self, R, C, r0, c0):

# path, initialized on starting point
path = [(r0, c0)]

is_valid = lambda row, col: 0 <= row < R and 0 <= col < C

# length of steps to move
steps = 1
r, c = r0, c0

# Keep walking until all grids are visited
while len(path) < R * C:

# Go east
for step in range(steps):
r, c = r, c + 1
if is_valid(r, c): path.append((r, c))

# Go down
for step in range(steps):
r, c = r + 1, c
if is_valid(r, c): path.append((r, c))

steps += 1

# Go west
for step in range(steps):
r, c = r, c - 1
if is_valid(r, c): path.append((r, c))

# Go north
for step in range(steps):
r, c = r - 1, c
if is_valid(r, c): path.append((r, c))

steps += 1

return path

複雜度分析

時間複雜度: O( Max{R, C}^2)

相當於以起點為圓心,邊長為半徑,以同心圓擴散,
順時針走的圖形,走的軌跡是一個回字型。
所需時間 = O( Max{R, C}^2) ~ (比較長的邊長)的平方


空間複雜度: O( R * C )

需要額外一個陣列去儲存走過的格子點,格子點總數 = 陣列大小 = R * C


Reference

[1]Spiral Matrix III - LeetCode

avatar-img
小松鼠的演算法樂園
95會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言
avatar-img
留言分享你的想法!
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
題目敘述 Number of Senior Citizens 給定一個旅客的車票字串陣列,美個字串的最後第四個和第三個數字代表旅客的年齡。 例如: XXX...XXX2015 代表旅客年齡為20歲。 總請計算共有多少位乘客的年齡 > 60 歲
題目要求計算兩個二進位字串的相加,並以字串的形式輸出。 字串內容只包含'0'或'1'字元。 複雜度分析 時間複雜度為O(m+n),空間複雜度為O(m+n)。
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述: 給定一個傳統手機鍵盤,如圖所示 接著給定一個字串word。 現在讓你重新安排每個字母的所在位置,每個字母可以重新安排到2~9這幾個鍵盤上的位置,每個字母限定只能選擇一個數字鍵去對應。 請問重新安排之後,最少要幾次按鍵才能輸出字串word?
題目敘述 Kth Distinct String in an Array 給定一個輸入陣列arr 和 參數k 請返回第k個出現恰好一次的陣列元素。
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
題目敘述 Number of Senior Citizens 給定一個旅客的車票字串陣列,美個字串的最後第四個和第三個數字代表旅客的年齡。 例如: XXX...XXX2015 代表旅客年齡為20歲。 總請計算共有多少位乘客的年齡 > 60 歲
題目要求計算兩個二進位字串的相加,並以字串的形式輸出。 字串內容只包含'0'或'1'字元。 複雜度分析 時間複雜度為O(m+n),空間複雜度為O(m+n)。