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

LeetCode 1013: Partition Array Into Three Parts With Equal Sum

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

基本資料
#

難易度: easy 第一次嘗試:2022-09-27

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

解題思路
#

每段的和必須是 target = total / 3,所以總和不能被 3 整除就不可能。從左往右累加,一湊到 target 就切(Greedy:越早切越好,剩下的部分只會有更多選擇)。只要能切出至少 3 段就成立:前兩段各是 target,剩下的全部合起來也一定是 target。target = 0 時可能切出超過 3 段,例如 [0, 0, 0, 0],所以判斷是 >= 3,不是 == 3。

我的嘗試
#

這題提交了 18 次,卡在「到底要切出幾段」:

  • 第一版就是正確的貪心,但判斷寫成 c == 3,沒想到和為 0 的段可以切出更多段:[0, 0, 2, -2, 0] 切成 0 | 0 | 2, -2 | 0 共 4 段,回傳 False,答案 True。
  • 接下來十幾版一直改結尾的條件:限制 c < 3 才切、要求最後 temp == target 等等,每次都換一組輸入失敗,例如 [1, 1, 1]、[2, 2, 2, 0]。有一版把 return 放進迴圈裡,第一個元素就回傳了。
  • 先 AC 的是「切到第 3 段時檢查剩下的和是 0」的版本,最後改回第一版、把 == 3 換成 >= 3,也 AC 了。

正確解法
#

class Solution:
    def canThreePartsEqualSum(self, arr: List[int]) -> bool:
        total = sum(arr)
        if total % 3:
            return False
        target, cur, parts = total // 3, 0, 0
        for x in arr:
            cur += x
            if cur == target:
                parts += 1
                cur = 0
        return parts >= 3

複雜度
#

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

要特別避免的錯誤
#

  • 判斷是 >= 3:和為 0 的段可以切得更多。
  • 不要在迴圈裡直接 return,第一次迭代就結束了。

面試口說整理
#

總和要能被 3 整除,每段是三分之一。我從左往右累加,一湊到三分之一就切一刀,最後切出至少三段就成立;三分之一是 0 時可能切出更多段,所以用大於等於。時間 O(n)。

相關文章

LeetCode 1005: Maximize Sum Of Array After K Negations
·1 分鐘
LeetCode Easy Array Greedy Sorting
LeetCode 1005 解題筆記:每次把最小的數變號;最小的已經是正數時,剩下的次數只要看奇偶
LeetCode 860: Lemonade Change
·2 分鐘
LeetCode Easy Array Greedy
LeetCode 860 解題筆記:只記 5 元和 10 元的張數;找 15 元時優先用 10 + 5,因為 5 元比較萬用
LeetCode 605: Can Place Flowers
·1 分鐘
LeetCode Easy Array Greedy
LeetCode 605 解題筆記:從左到右,左右都空的空格就種下去;種下去的花會擋住下一格,要真的更新陣列
LeetCode 561: Array Partition
·1 分鐘
LeetCode Easy Array Greedy Sorting Counting-Sort
LeetCode 561 解題筆記:排序後相鄰兩個一組,每組的最小值就是偶數位置的數,加總
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次
LeetCode 942: DI String Match
·1 分鐘
LeetCode Easy Array Two-Pointers String Greedy
LeetCode 942 解題筆記:兩個指標分別指向還沒用的最小值和最大值,遇到 I 放最小、遇到 D 放最大