2020年4月12日 星期日

Leetcode題解 Python:四月挑戰DAY12 Last Stone Weight

給一串數列,取出最大的兩個相減,如果結果非零,而把結果加回數列,重複進行,直到剩一個元素或是沒有元素,回傳該元素的值,若無而回傳 0。

一說到要取出最大的兩個,就會想到用 sort() 排列。 ※注意 sort() 是從小而大排列,想要反敘可以這樣寫 sort(reverse = True)。

每一次取出前兩個對減,加回去再重新排列,重複步驟直到不能再進行,這是最直覺的方式。

排列之後會照大小排列,如果取出兩元素相減後還 >= 剩下的第一個元素,代表兩者是當前最大的兩元素,就可以繼續相減。

條件不符合加回去再重新排列,這樣可以減少不必要的排列次數。

class Solution:
    def lastStoneWeight(self, stones: List[int]) -> int:        
        n = len(stones)        
        while n > 1:
            stones.sort(reverse = True)
            v = stones.pop(0)
            while n > 1 and v >= stones[0]:
                v -= stones.pop(0)
                n -= 1
            if v == 0: n-= 1
            else: stones.append(v)        
        if stones: return stones[-1]
        else: return 0