周賽359。這個k-avoiding還真不好翻譯,中文站也沒翻。

題目

輸入整數n和k。

如果一個由不同正整數組成的陣列,不存在任何數對總和為k,則稱為免k陣列。

求長度n的免k陣列的最小總和

解法

k只能由兩個正整數組成,那這兩個數i, j一定小於k。

假設k=5,有兩種解法:

1 + 4 2 + 3

為了避免k,只能選擇其中一個。而為了想要總和小,則應當選擇較小者、拋棄較大者。
我們由大到小遍歷整數,並檢查i=k-t是否已經選過。

時間複雜度O(n)。
空間複雜度O(n)。

class Solution:
    def minimumSum(self, n: int, k: int) -> int:
        s=set()
        i=1
        while len(s)<n:
            if k-i not in s:
                s.add(i)
            i+=1
            
        return sum(s)

剛才說過,小於k的數中,只有一半能使用。

另a = k/2,如果a大於等於n,則答案就是1~n加總;否則還需要額外n-a的數字,從k開始,最後一個數是k+(n-a)-1,代入梯形公式求解。

時間複雜度O(1)。
空間複雜度O(1)。

class Solution:
    def minimumSum(self, n: int, k: int) -> int:
        
        def rsum(s,e):
            return (s+e)*(e-s+1)//2
        
        a=min(n,k//2)
        # need n-a more
        # k ... (k+n-a-1)
        first=k
        last=k+n-a-1
        
        return rsum(1,a)+rsum(first,last)