4.4 練習
基礎難度
451. Sort Characters By Frequency
桶排序的變形題。
題解
解題思路
本題要求根據字元的出現頻率對字元進行排序,並返回排序後的字串。可以使用 雜湊表 和 桶排序 來高效解決這個問題。
-
統計字元頻率:
- 使用
Counter
統計每個字元的出現次數,將結果儲存到counts
。
- 使用
-
桶排序:
- 建立一個桶
buckets
,其中索引表示字元的出現頻率,值是具有該頻率的字元列表。 - 根據字元的頻率將它們放入對應的桶中。
- 建立一個桶
-
生成結果:
- 從高頻到低頻遍歷桶,根據頻率將字元重複相應次數,拼接成結果字串。
程式碼
class Solution:
def frequencySort(self, s: str) -> str:
counts = Counter(s)
buckets = dict()
result = []
for char, count in counts.items():
if count in buckets:
buckets[count].append(char)
else:
buckets[count] = [char]
for count in range(len(s), 0, -1):
if count in buckets:
for char in buckets[count]:
result.append(char*count)
return ''.join(result)
複雜度分析
-
時間複雜度:
- ,其中 是字串的長度。統計頻率需要 ,桶排序和拼接結果也需要 。
-
空間複雜度:
- ,用於儲存字元頻率的雜湊表和桶。
進階難度
75. Sort Colors
非常經典的荷蘭國旗問題,考察如何對三個重複且混亂的值進行排序。
題解
解題思路
本題要求對包含 0
、1
和 2
的陣列進行排序,使得相同數字的元素相鄰,並且按照 0
、1
、2
的順序排列。我們可以在 的時間複雜度內使用 雙指標(雙指針) 來完成排序,該方法被稱為 荷蘭國旗問題。
-
初始化三個指標:
left
: 指向下一個要放置0
的位置。right
:指向下一個要放置2
的位置。i
:當前遍歷的索引。
-
遍歷陣列:
- 當
nums[i] == 0
時,將nums[i]
與nums[left]
交換,然後將left
和i
向右移動。 - 當
nums[i] == 2
時,將nums[i]
與nums[right]
交換,並將right
向左移動(此時不移動i
,因為交換過來的值可能還需要處理)。 - 當
nums[i] == 1
時,僅將i
向右移動。
- 當
-
終止條件:
- 當
i
超過right
時,排序完成。
- 當
程式碼
class Solution:
def sortColors(self, nums: List[int]) -> None:
left, i, right = 0, 0, len(nums) - 1
while i <= right:
if nums[i] == 0:
nums[left], nums[i] = nums[i], nums[left]
left += 1
i += 1
elif nums[i] == 2:
nums[right], nums[i] = nums[i], nums[right]
right -= 1
else:
i += 1
複雜度分析
- 時間複 雜度: ,其中 是陣列的長度。每個元素最多只被遍歷一次。
- 空間複雜度: ,僅使用了常數額外空間。