↓快轉到主要內容
  1. LeetCode/

LeetCode 324: Wiggle Sort II

·1 分鐘· ·
LeetCode Medium Array Divide-and-Conquer Greedy Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-17

  • 提交紀錄:Wrong Answer → Runtime Error → Accepted → Wrong Answer

解題思路
#

nums[0] < nums[1] > nums[2] < ...:偶數位置放小的、奇數位置放大的。排序後前半(較小的 ceil(n / 2) 個)放偶數位置、後半放奇數位置,但兩半都要反轉:如果照遞增順序放,小半的最後一個和大半的第一個可能相等(中位數重複時),而它們剛好會相鄰。反轉之後,相等的中位數會被放在兩端,不會碰在一起。進階要求 O(n) 時間、O(1) 空間,要用 quickselect 找中位數加上 3-way partition 和虛擬 index。

我的嘗試
#

第一版照遞增順序直接交錯放,重複的中位數碰在一起:[2, 4, 1, 2] 排序後是 [1, 2, 2, 4],放完變成 [1, 2, 2, 4],2 和 2 相鄰不符合。改成兩半都反轉,中間有一次切片的範圍算錯(ValueError),之後就 AC 了。

正確解法
#

class Solution:
    def wiggleSort(self, nums: List[int]) -> None:
        s = sorted(nums)
        half = (len(nums) + 1) // 2
        nums[::2] = s[:half][::-1]
        nums[1::2] = s[half:][::-1]

複雜度
#

時間 O(n log n),空間 O(n)。

要特別避免的錯誤
#

  • 兩半都要反轉,不然重複的中位數會相鄰。
  • 小的一半是 ceil(n / 2) 個,放在偶數位置。

面試口說整理
#

我排序後把較小的一半放偶數位置、較大的一半放奇數位置,兩半都反轉,這樣重複的中位數會被分到兩端,不會相鄰。時間 O(n log n);進階的 O(n) 要用 quickselect 找中位數再做三向分割。

相關文章

LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 215: Kth Largest Element in an Array
·1 分鐘
LeetCode Medium Array Divide-and-Conquer Sorting Heap-Priority-Queue
LeetCode 215 解題筆記:維持大小為 k 的 min-heap,堆頂就是第 k 大;或用 quickselect 平均 O(n)
LeetCode 347: Top K Frequent Elements
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Sorting
LeetCode 347 解題筆記:先計數,再用大小為 k 的 heap 或 bucket sort(次數當 index)取出次數最多的 k 個
LeetCode 148: Sort List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Divide-and-Conquer Sorting
LeetCode 148 解題筆記:用快慢指針切成兩半,遞迴排序後合併;O(n log n),不需要額外陣列
LeetCode 334: Increasing Triplet Subsequence
·1 分鐘
LeetCode Medium Array Greedy Longest-Increasing-Subsequence
LeetCode 334 解題筆記:維護目前最小的 first 和「前面有比它小的數」中最小的 second,遇到比 second 大的就找到了
LeetCode 229: Majority Element II
·1 分鐘
LeetCode Medium Array Hash-Table Sorting Counting
LeetCode 229 解題筆記:超過 n / 3 的數最多兩個;Boyer-Moore 維護兩個候選人,最後再掃一次確認次數