周賽338。糟透了,周賽開始後40分鐘幾乎整個網站都是掛掉的。

題目

背包裡面有一些物品,每個物品都標著1, 0或-1。

輸入四個非負整數numOnes, numZeros, numNegOnes和k。

背包裡面有:

  • numOnes個物品寫著1
  • numZeroes個物品寫著0
  • numNegOnes個物品寫著-1

你要拿k個物品。求物品上所標的數字最大總和為多少。

解法

優先拿1的,不夠再來拿0,最後才拿-1。

三種物品最多各50個,最多也才150而已,直接把三種物品依序塞入陣列,回傳前k個總和。

時空間複雜度O(numOnes + numZeros + numNegOnes)。

class Solution:
    def kItemsWithMaximumSum(self, numOnes: int, numZeros: int, numNegOnes: int, k: int) -> int:
        a=[1]*numOnes+[0]*numZeros+[-1]*numNegOnes
        return sum(a[:k])

最佳解應該直接和三個數取最小值,不可拿超過k的量。

時空間複雜度O(1)。

class Solution:
    def kItemsWithMaximumSum(self, numOnes: int, numZeros: int, numNegOnes: int, k: int) -> int:
        ans=0
        delta=1
        for x in [numOnes,numZeros,numNegOnes]:
            take=min(k,x)
            k-=take
            ans+=take*delta
            delta-=1
            
        return ans