返回

算法实战 | 1046. 最后一块石头的重量:揭秘贪心算法的精髓

前端

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. 结语:算法修炼之路

算法修炼之路漫长而艰辛,但只要你坚持不懈地学习和实践,就一定能够有所收获。希望我的分享能够对大家有所帮助,也希望大家能够和我一起,在算法的海洋中遨游,不断进步,不断成长!