返回
算法实战 | 1046. 最后一块石头的重量:揭秘贪心算法的精髓
前端
2024-01-25 00:19:33
01. 题目简介:石头的重量博弈
大家好,我是算法摸鱼老阿木木。今天,我将带大家一起学习LeetCode 1046题:最后一块石头的重量。这道题乍看之下很简单,但实际上却蕴藏着贪心算法的精髓。
题目
有一堆石头,每块石头的重量都是正整数。
- 你可以选择两块石头,并将它们合并成一块新的石头,新石头的重量等于这两块石头的重量之和。
- 你可以重复这个过程,直到只剩下最后一块石头。
问题是:
你如何才能使最后一块石头的重量尽可能小?
02. 贪心算法的精髓:化繁为简
贪心算法是一种很常用的算法,它通过在每一步中做出最优选择,来逐步逼近最优解。在解决这道题时,贪心算法的精髓在于:把复杂问题分解成一个个简单子问题,然后逐个解决这些子问题。
在具体实现时,我们可以按照以下步骤进行:
- 初始化一个石头重量列表
stones
,其中包含了所有石头的重量。 - 循环遍历
stones
列表,直到只剩下最后一块石头。 - 在每次循环中,选择重量最小的两块石头,并将其合并成一块新的石头。
- 将合并后的石头添加到
stones
列表中,并从stones
列表中删除重量最小的两块石头。
通过这种方式,我们可以一步一步地减少石头数量,并最终得到最后一块石头的重量。
03. 代码实现:Python解法
def last_stone_weight(stones):
"""
:type stones: List[int]
:rtype: int
"""
while len(stones) > 1:
# 找到重量最小的两块石头
stones.sort()
stone1, stone2 = stones[0], stones[1]
# 将它们合并成一块新的石头
new_stone = stone1 + stone2
# 将合并后的石头添加到 stones 列表中
stones.append(new_stone)
# 从 stones 列表中删除重量最小的两块石头
stones.pop(0)
stones.pop(0)
# 返回最后一块石头的重量
return stones[0]
stones = [2, 7, 4, 1, 8, 1]
result = last_stone_weight(stones)
print(result) # 输出:1
04. 总结与提升:贪心算法的应用
贪心算法是一种非常实用的算法,它在很多场景下都有着广泛的应用。例如,在解决背包问题、哈夫曼编码、活动选择问题等问题时,贪心算法都可以发挥出强大的作用。
贪心算法的精髓在于:化繁为简,把复杂问题分解成一个个简单子问题,然后逐个解决这些子问题。 掌握了贪心算法的精髓,你将能够轻松解决很多算法题,并提升自己的算法能力。
05. 结语:算法修炼之路
算法修炼之路漫长而艰辛,但只要你坚持不懈地学习和实践,就一定能够有所收获。希望我的分享能够对大家有所帮助,也希望大家能够和我一起,在算法的海洋中遨游,不断进步,不断成长!