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

LeetCode 2561: Rearranging Fruits

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

基本資料
#

難易度: hard 第一次嘗試:2026-09-15

  • 提交紀錄:Wrong Answer → Accepted ×2

解題思路
#

  1. 可不可能:兩籃最後要一樣,所以每種值的總數要是偶數,每籃各一半。有一種是奇數就回傳 -1。
  2. 要換哪些:每種值在籃子 1 裡多出或少了 |count1 - total / 2| 個。把兩邊多出來的都列出來(need),長度是 2 × 交換次數,每次交換把一邊多的一個和另一邊多的一個對調。
  3. 怎麼配最便宜:一次交換的成本是兩者較小的值。把 need 排序,讓便宜的前一半各配一個貴的,每次付便宜那個的值。
  4. 借最小值當中介:全域最小的水果 m 可以來回換兩次,把一對對調,成本 2m。所以每次的成本是 min(need[i], 2m)。

這是 Greedy 模板四的配對想法。

我的嘗試
#

第一版想用兩個 deque 從兩邊配對,但抵銷共同部分的 while 條件用的是 for k, v in ...items() 取出的 v,v 在迴圈裡不會變,所以會一直減到另一邊歸零,計數變成負的。例如 basket1 = [3, 3, 1]、basket2 = [1, 1, 1]:答案是 1(拿一個 3 換一個 1),這版把 1 的計數減成 -2,最後回傳 0。這版也沒有考慮用最小值當中介。

改成上面的做法,就 AC 了。

正確解法
#

class Solution:
    def minCost(self, basket1: List[int], basket2: List[int]) -> int:
        c1, total = Counter(basket1), Counter(basket1) + Counter(basket2)
        need = []
        for v, c in total.items():
            if c % 2:
                return -1
            need += [v] * abs(c // 2 - c1[v])
        need.sort()
        m = min(total)
        return sum(min(x, 2 * m) for x in need[:len(need) // 2])

複雜度
#

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

要特別避免的錯誤
#

  • 迴圈條件不要用迴圈外取出、之後不會更新的值。
  • 別忘了用全域最小值當中介,有時比直接換便宜。

面試口說整理
#

每種值總數要是偶數才可能。我把兩籃多出來的水果列出來排序,便宜的一半各跟貴的一個交換,成本是便宜的那個;也可以用全域最小值來回換兩次,成本是兩倍最小值,所以每次取兩者較小的。時間 O(n log n)。

相關文章

LeetCode 2141: Maximum Running Time of N Computers
·1 分鐘
LeetCode Hard Greedy Binary-Search Sorting
LeetCode 2141 解題筆記:比平均時間還大的電池只能給一台電腦用,連同那台電腦一起拿掉,剩下的取平均;要用嚴格的大於
LeetCode 3684: Maximize Sum of At Most K Distinct Elements
·1 分鐘
LeetCode Easy Greedy Sorting Hash-Table
LeetCode 3684 解題筆記:全是正數,去重後由大到小取前 k 個
LeetCode 2122: Recover the Original Array
·2 分鐘
LeetCode Hard Two-Pointers Sorting Hash-Table Enumeration Array
LeetCode 2122 解題筆記:最小的數一定在 lower,枚舉它的配對決定 k;排序後用兩個指針把每個最小的未配對數配給 +2k 的數
LeetCode 1782: Count Pairs Of Nodes
·2 分鐘
LeetCode Hard Two-Pointers Graph Sorting Hash-Table Counting
LeetCode 1782 解題筆記:先用排序後的度數 + 對撞指針數 deg[a] + deg[b] > q 的配對,再對有共用邊的配對修正多算的部分
LeetCode 2357: Make Array Zero by Subtracting Equal Amounts
·1 分鐘
LeetCode Easy Array Hash-Table Greedy Sorting
LeetCode 2357 解題筆記:每次操作會讓最小的正數那一群變成 0,所以次數就是不同的正數有幾種
LeetCode 1402: Reducing Dishes
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Sorting Array
LeetCode 1402 解題筆記:排序後從滿意度大的開始選;每多選一道放在最前面,前面選的都往後一格,總和增加「目前選的滿意度總和」,總和是正的就繼續選