强强合作!「LeetCode」198 打家劫舍,实现最优解!
2023-10-04 19:25:34
前言:走进「LeetCode」的世界
「LeetCode」是一个广受欢迎的算法题库网站,以其丰富的问题集和多样化的难度等级而闻名。它深受程序员的喜爱,也是许多公司在面试中常用的考察工具。如果想要成为一名优秀的程序员,系统地刷题是必不可少的,而「LeetCode」无疑是磨练算法技能的不二之选。
问题概述:打家劫舍
「LeetCode」的第 198 题:打家劫舍,了一个经典的动态规划问题。假设你有一排房屋,每个房屋都存放着一定数量的钱。你计划实施一项抢劫行动,但有一个条件:你不能触动任何警报。也就是说,你必须按照房屋的顺序从左到右进行抢劫,并且不能抢劫相邻的房屋。
解题思路:动态规划
动态规划是一种解决复杂问题的有效方法,其核心思想是将问题分解成若干个子问题,然后逐个解决这些子问题,最终得到整个问题的解。在「打家劫舍」问题中,我们可以定义一个动态规划表 dp,其中 dp[i] 表示抢劫到第 i 个房屋时所能获得的最大金额。
详细步骤:
- 初始化动态规划表:
将 dp[0] 设置为 0,表示抢劫到第 0 个房屋时没有任何收益。
- 迭代计算动态规划表:
从第 1 个房屋开始,依次计算动态规划表的每个元素。对于第 i 个房屋,我们可以有两种选择:
- 抢劫第 i 个房屋: 在这种情况下,我们将获得第 i 个房屋的钱数,然后加上抢劫到第 i-2 个房屋时的最大金额,因为我们不能抢劫相邻的房屋。
- 不抢劫第 i 个房屋: 在这种情况下,我们将沿用抢劫到第 i-1 个房屋时的最大金额。
- 选择较大值:
对于第 i 个房屋,我们选择抢劫或不抢劫所获得的金额中的较大值作为 dp[i] 的值。
- 返回结果:
当计算完整个动态规划表后,我们将返回 dp[n-1] 的值,其中 n 表示房屋的数量。该值表示抢劫到最后一间房屋时所能获得的最大金额。
示例代码:
def rob(nums):
"""
:type nums: List[int]
:rtype: int
"""
# 初始化动态规划表
dp = [0] * len(nums)
dp[0] = nums[0]
# 迭代计算动态规划表
for i in range(1, len(nums)):
dp[i] = max(dp[i-1], dp[i-2] + nums[i])
# 返回结果
return dp[-1]
总结:算法之美
「LeetCode」的第 198 题:打家劫舍,是一个经典的动态规划问题。通过将问题分解成若干个子问题,并使用动态规划表来存储子问题的解,我们可以有效地求得整个问题的最优解。算法之美在于其能够将复杂问题简化为一系列简单的问题,并通过逐步求解这些简单问题来得到整个问题的解。这种方法不仅适用于「打家劫舍」问题,也适用于许多其他现实世界的优化问题。