前往
大廳
主題

LeetCode - 2161. Partition Array According to Given Pivot 解題心得

Not In My Back Yard | 2023-10-31 12:00:22 | 巴幣 0 | 人氣 63

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的整數陣列 nums 以及一整數 pivot。將 nums 重新排列使得以下條件滿足:
每一個小於 pivot 的元素都位於每一個大於 pivot 的元素之前。
每一個等於 pivot 的元素位於小於 pivot 的元素以及大於 pivot 的元素之間。
小於 pivot 的元素之間的相對順序維持不變,而大於 pivot 的元素之間的相對順序也保持不變。
    更正式地說,考慮每一對 pi 和 pj,其中 pi 為第 i 個元素的新位置、pj 為第 j 個元素的新位置。對於所有小於 pivot 的元素(其實這句話不用寫,因為隱含於接下來的句子。但原文如此),如果 i < j 且 nums[i] < pivot 且 nums[j] < pivot,則 pi < pj;相似地,對於所有大於 pivot 的元素(同前),如果 i < j 且 nums[i] > pivot 且 nums[j] > pivot,則 pi < pj。

回傳重新排列後的 nums。

限制:
1 ≦ nums.length ≦ 10 ^ 5
-10 ^ 6 ≦ nums[i] ≦ 10 ^ 6
pivot 等於 nums 中某個元素。



範例測資:
範例 1:
輸入: nums = [9,12,5,10,14,3,10], pivot = 10
輸出: [9,5,3,10,10,12,14]
解釋:
元素 9 、 5 和 3 皆小於 pivot,所以它們位於陣列的左側。
元素 12 和 14 皆大於 pivot,所以它們位於陣列的右側。
小於 pivot 的元素之間的相對順序維持不變,而大於 pivot 的元素之間的相對順序也保持不變。[9, 5, 3] 和 [12, 14] 為對應的相對順序。

範例 2:
輸入: nums = [-3,4,3,2], pivot = 2
輸出: [-3,2,4,3]
解釋:
元素 -3 皆小於 pivot,所以它們位於陣列的左側。
元素 4 和 3 皆大於 pivot,所以它們位於陣列的右側。
小於 pivot 的元素之間的相對順序維持不變,而大於 pivot 的元素之間的相對順序也保持不變。[-3] 和 [4, 3] 為對應的相對順序。


解題思維:
其實跟這題提到的三方分割(Three-way Partitioning)基本上一致。

不過如果直接使用該題提及的虛擬碼,會讓大於 pivot 的元素那一側的相對順序顛倒。因此可以在最後的時候把它們糾正回來;又或是在進行分割時分成兩次運行,第一次由左至右掃過 nums 並只處理小於 pivot 的數字,第二次則是由右至左掃過 nums 並只處理大於 pivot 的數字。兩種方式都可以。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作