每日題。有點像今早周賽Q3,如果今天有人先做完這題再去周賽,或許會更加順暢。
昨晚打雙周賽,今早打周賽,打完更新win10,今天真是充實的一天。

題目

輸入整數陣列cardPoints,代表好幾張牌的點數,整數k代表可以選擇的牌數。
你每次可以選擇排堆中最前或是最後一張牌,並獲得其分數。
求最多可以獲得幾分。

解法

只能從兩邊拿牌,不管怎樣拿,最後一定會剩下中心的一塊連續區域。
與其列舉左右得到多少分,不如算出中間的N-k張牌的最小值為多少,剩餘的牌點數越小,則得分越大。

若選擇牌數k和總牌數相等,可直接回傳cardPoints總和sm。
列舉每個索引r為滑動窗口的右邊界,若大小滿足k,則以視窗內分數更新最小值mn。
最後sm扣掉mn即是左右選牌可獲得的最大分數。

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        N=len(cardPoints)
        if k==N:
            return sum(cardPoints)
        
        size=N-k
        window=0
        mn=inf
        l=0
        for r in range(N):
            window+=cardPoints[r]
            if r-l+1==size:
                mn=min(mn,window)
                window-=cardPoints[l]
                l+=1

        return sum(cardPoints)-mn