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

LeetCode 1423: Maximum Points You Can Obtain from Cards

·1 分鐘· ·
LeetCode Medium Sliding-Window Prefix-Sum Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2025-12-24

  • 提交紀錄:Accepted(一次通過)

解題思路
#

每次只能從頭或尾拿,拿 k 張之後,留下來的一定是中間連續的 n - k 張。

所以「拿到的最大和」= 總和 −「長度 n - k 的連續子陣列的最小和」,用固定長度的滑動視窗就能找。

我的解法
#

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        n = len(cardPoints)
        size = n - k                               # 留下來的張數
        window = sum(cardPoints[:size])
        smallest = window
        for right in range(size, n):
            window += cardPoints[right] - cardPoints[right - size]
            smallest = min(smallest, window)
        return sum(cardPoints) - smallest

k == n 時 size = 0,視窗一直是 0,答案是總和。

複雜度
#

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

要特別避免的錯誤
#

  • 用貪心每次拿兩端比較大的那張:前面的選擇會影響後面能拿到什麼,不一定最好。

面試口說整理
#

從兩端拿 k 張,留下來的是中間連續的 n - k 張。所以我改找長度 n - k 的連續子陣列最小和,用固定長度的滑動視窗,答案是總和減掉它。時間 O(n)。

相關文章

LeetCode 1248: Count Number of Nice Subarrays
·2 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 1248 解題筆記:「剛好 k 個奇數」不單調,改成「最多 k 個」減「最多 k - 1 個」;或用前綴和 + 雜湊表
LeetCode 209: Minimum Size Subarray Sum
·1 分鐘
LeetCode Daily Medium Array Sliding-Window Two-Pointers Prefix-Sum Binary-Search
滑動視窗與雙指針,最小化子陣列長度(總和 ≥ target)。
LeetCode 1658: Minimum Operations to Reduce X to Zero
·1 分鐘
LeetCode Daily Medium Array Sliding-Window Prefix-Sum Reverse-Thinking
LeetCode 解題紀錄 - 反向思考與滑動窗口
LeetCode 1343: Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold
·1 分鐘
LeetCode Daily Medium Array Sliding-Window Prefix-Sum Average-Calculation
LeetCode 解題紀錄 - 固定大小滑動窗口與總和計算
LeetCode 2461: Maximum Sum of Distinct Subarrays With Length K
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2461 解題筆記:固定長度 k 的視窗,不同值的個數剛好等於 k 才代表全部不重複
LeetCode 1493: Longest Subarray of 1's After Deleting One Element
·1 分鐘
LeetCode Medium Sliding-Window Dynamic-Programming Array
LeetCode 1493 解題筆記:找「最多 1 個 0」的最長視窗,因為一定要刪一個元素,答案是視窗長度減 1