模擬雙周賽72。回想起來,當時練習的時候是5/7晚上10點左右,結果網站竟然炸掉快半小時!當時還想說:明天周賽最好不要給我出事,然後就真的出事了。

題目

輸入一個數字finalSum,盡可能將其分割成多個不重複正偶數
例:12可以拆成(2,4,6),但不可以是(2,2,4,4)。

回傳一個整數串列,代表任一種合法的拆分方式。如果無法拆分,則回傳空串列。

解法

要把某個數n拆分成x個偶數,那n一定也得是偶數。
一開始可以先把奇數過濾掉,直接回傳[]。

仔細想想,既然要盡可能拆成多個數,那我就先從最小的數字2開始拆,每次拆完就遞增2。
那麼迴圈的中止條件是什麼?本想要用set紀錄那些用過,但是若真碰到重複值,就很難處理。
更保險的方法是:確保剩餘的finalSum扣除掉分割數lo之後,還能拆出一個比lo更大的數。

class Solution:
    def maximumEvenSplit(self, finalSum: int) -> List[int]:
        if finalSum&1:
            return []
        ans=[]
        lo=2
        while finalSum>lo*2:
            ans.append(lo)
            finalSum-=lo
            lo+=2
            
        ans.append(finalSum)
        
        return ans

看看別人的作法,和我的思路剛好相反。
我是從finalSum開始拆解,他是從2開始加入,直到總和即將超過finalSum之際停止。
迴圈停止時總和不一定會等於finalSum,所以把差值塞回最後一個數字裡面。

class Solution:
    def maximumEvenSplit(self, finalSum: int) -> List[int]:
        if finalSum&1:
            return []
        ans=[]
        curr=0
        lo=2
        while curr+lo<=finalSum:
            ans.append(lo)
            curr+=lo
            lo+=2
            
        ans[-1]+=finalSum-curr
            
        return ans