題目出處
難度
medium
個人範例程式碼
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# only 0, 1, 2
self.partition(nums, 2, 0, len(nums)-1)
return
def partition(self, nums, pivot, start, end):
if pivot == 0:
return
left, right = start, end
while(left <= right):
while(left <= right and nums[left] < pivot): # 0, 1
left += 1
while(left <= right and nums[right] >= pivot): # 2
right -= 1
if(left <= right):
nums[left], nums[right] = nums[right], nums[left]
# check twice
# left += 1
# right -= 1
else: # after left and right cross, all 0, 1 will be left, 2 will be right
# start, right(0, 1), left(2), end
# start, right(0), left(1), end
self.partition(nums, pivot-1, 0, right)
算法說明
此題是考 partition 的延伸題,也可以單純使用三指標來快速解掉,
不過之後還有一題多顏色的題目,基本上 partition 還是要會解。
這題會經常錯在遞迴判斷式與邊界條件,導致無法 AC。
遞迴判斷式
遞迴的定義
while(left <= right):
while(left <= right and nums[left] < pivot): # 0, 1
left += 1
while(left <= right and nums[right] >= pivot): # 2
right -= 1
if(left <= right):
nums[left], nums[right] = nums[right], nums[left]
遞迴的拆解
這邊要處理的是邊界問題,往前我們還需要多注意 while(left <= right),
這會導致我們是「交錯」才結束,
結束時的狀態為 「start < right < left < end」,由於與 pivot 相等的在兩側都有可能出現,
拆解的搜尋條件為
- start ~ right
- left ~ end
這題本身較簡單,但其實不需要拆到那麼複雜,
但為了後續的 partition 題目方便,這裡就先用最泛用的方式解
self.partition(nums, pivot-1, 0, right)
遞迴的中止
如果 pivot = 0,return
一樣也是因為這題題目相對單純,因此我們可以這樣寫死。
input handling
這題沒有特別說要怎麼處理特殊的 input,預設的 input 都給正確的。
Boundary conditions
上方已經說明完囉
Reference
⭐ Leetcode 解題紀錄 ⭐ | 題型 | 資料結構 | Python Solution | C++ Solution | Note | |
---|---|---|---|---|---|---|
⭐BFS 相關題型 ⭐ | ||||||
104 | Maximum Depth of Binary Tree | BFS (分層) | Python | |||
94 | Binary Tree Inorder Traversal | BFS (分層) | Tree | Python | 內含 處理 Tree 樹問題的重點 | |
102 | Binary Tree Level Order Traversal | BFS (分層) | Tree | Python | ||
103 | Binary Tree Zigzag Level Order Traversal | BFS (分層) | Tree | Python | ||
107 | Binary Tree Level Order Traversal II | BFS (分層) | Tree | Python | ||
133 | Clone Graph | BFS (分層) | Graph | Python | Graph 的基本操作 #重要題型 | |
127 | Word Ladder | BFS (分層), DFS | Graph | Python | ||
[Lint] 127 | Topological Sorting | BFS (拓撲) | Python | 內有 indegree, outdegree 介紹 #重要題型 | ||
207 | Course Schedule | BFS (拓樸) | Graph | Python | ||
210 |