題目描述:
有一堆石頭,每塊石頭的重量都是正整數。
每一回合,從中選出兩塊最重的石頭,然後將它們一起粉碎。假設石頭的重量分別爲 x 和 y,且 x <= y。那麼粉碎的可能結果如下:
如果 x == y,那麼兩塊石頭都會被完全粉碎;
如果 x != y,那麼重量爲 x 的石頭將會完全粉碎,而重量爲 y 的石頭新重量爲 y-x。
最後,最多隻會剩下一塊石頭。返回此石頭的重量。如果沒有石頭剩下,就返回 0。
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
解題思路:
將數組排序,選出最大的兩個做差,如果差值不爲0,將差值添加到去除最大兩個數之後的數組中
重複上述步驟,直到數組長度小於等於1爲止
由於每進行一次操作都要進行一次排序,時間複雜度爲n^2
————————————————
解法1:
class Solution(object):
def lastStoneWeight(self, stones):
"""
:type stones: List[int]
:rtype: int
"""
while len(stones)>1:
stones.sort()
x=stones[-1]-stones[-2]
stones=stones[:-2]
if x!=0:
stones.append(x)
#print(stones)
return 0 if len(stones)==0 else stones[0]
解法2:堆:
在python中的堆默認是小根堆,爲了實現大根堆,一個方式是把所有的數字進行取反操作,最後的結果再取反即可
import heapq
class Solution(object):
def lastStoneWeight(self, stones):
"""
:type stones: List[int]
:rtype: int
"""
stones = [-x for x in stones]
heapq.heapify(stones)
while len(stones) > 1:
x = heapq.heappop(stones)
y = heapq.heappop(stones)
if x != y:
heapq.heappush(stones, -abs(x - y))
return 0 if not stones else -stones[0]