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

LeetCode 1005: Maximize Sum Of Array After K Negations

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

基本資料
#

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

  • 提交紀錄:Runtime Error → Accepted

解題思路
#

貪心(Greedy 模板一):每次把目前最小的數變號,總和增加最多。用 min-heap 做 k 次 heappop、heappush(-x) 就好,O(k log n)。也可以排序後先把負數由小到大變號,剩下的次數是奇數時,再把絕對值最小的那個變號一次。

我的嘗試
#

第一版縮排錯誤(Runtime Error),修好之後同樣的 min-heap 寫法就 AC 了。

正確解法
#

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        heapq.heapify(nums)
        for _ in range(k):
            heapq.heappush(nums, -heapq.heappop(nums))
        return sum(nums)

複雜度
#

時間 O(n + k log n),空間 O(1)。

要特別避免的錯誤
#

  • 同一個數可以被變號很多次,最小的是正數時會來回變號,所以 heap 寫法自然處理了奇偶。

面試口說整理
#

每次把最小的數變號能讓總和增加最多,我用 min-heap 做 k 次,取出最小的變號後放回去,最後加總。最小的是正數時會在同一個數上來回變號,等於只看剩下次數的奇偶。時間 O(n + k log n)。

相關文章

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 1013: Partition Array Into Three Parts With Equal Sum
·1 分鐘
LeetCode Easy Array Greedy
LeetCode 1013 解題筆記:總和要能被 3 整除,從左邊累加,每湊到 total / 3 就切一刀,切出至少 3 段就成立
LeetCode 977: Squares of a Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 977 解題筆記:平方後最大的一定在兩端,左右指針比較兩端的平方,大的從結果的最後面往前填
LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣
LeetCode 922: Sort Array By Parity II
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 922 解題筆記:偶數位置的指標 i、奇數位置的指標 j,各自跳兩格;i 放錯(奇數)時讓 j 找到放錯的偶數再交換