leetcode 1046【最后一块石头的重量】
题目链接
https://leetcode-cn.com/problems/last-stone-weight/
解题思路与代码思路:
列表排序法
这个最直观,对列表进行排序,然后pop出来相减就完事了,while循环直到最后只剩下一个元素
最大堆法
首先把所有数字变成负数,就可以看成最大堆了。还是采用while循环,相减就完事了。最后再把负数转回来
代码:
列表排序法
class Solution:
def lastStoneWeight(self, stones: List[int]) -> int:
while len(stones)>1:
stones = sorted(stones)
stones.append(stones.pop()-stones.pop())
return stones[0]
最大堆法
class Solution:
def lastStoneWeight(self, stones: List[int]) -> int:
heap = [-i for i in stones]
heapify(heap)
while len(heap)>1:
heappush(heap, heappop(heap)-heappop(heap))
return -heap[0]
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 列表排序法
- 时间复杂度:O(n^2logn),做n次快排
- 空间复杂度:O(1)
- 堆法
- 时间复杂度:O(n),heap操作为O(1)
- 空间复杂度:O(n) ,维护堆