返回

强强合作!「LeetCode」198 打家劫舍,实现最优解!

前端

前言:走进「LeetCode」的世界

「LeetCode」是一个广受欢迎的算法题库网站,以其丰富的问题集和多样化的难度等级而闻名。它深受程序员的喜爱,也是许多公司在面试中常用的考察工具。如果想要成为一名优秀的程序员,系统地刷题是必不可少的,而「LeetCode」无疑是磨练算法技能的不二之选。

问题概述:打家劫舍

「LeetCode」的第 198 题:打家劫舍,了一个经典的动态规划问题。假设你有一排房屋,每个房屋都存放着一定数量的钱。你计划实施一项抢劫行动,但有一个条件:你不能触动任何警报。也就是说,你必须按照房屋的顺序从左到右进行抢劫,并且不能抢劫相邻的房屋。

解题思路:动态规划

动态规划是一种解决复杂问题的有效方法,其核心思想是将问题分解成若干个子问题,然后逐个解决这些子问题,最终得到整个问题的解。在「打家劫舍」问题中,我们可以定义一个动态规划表 dp,其中 dp[i] 表示抢劫到第 i 个房屋时所能获得的最大金额。

详细步骤:

  1. 初始化动态规划表:

将 dp[0] 设置为 0,表示抢劫到第 0 个房屋时没有任何收益。

  1. 迭代计算动态规划表:

从第 1 个房屋开始,依次计算动态规划表的每个元素。对于第 i 个房屋,我们可以有两种选择:

  • 抢劫第 i 个房屋: 在这种情况下,我们将获得第 i 个房屋的钱数,然后加上抢劫到第 i-2 个房屋时的最大金额,因为我们不能抢劫相邻的房屋。
  • 不抢劫第 i 个房屋: 在这种情况下,我们将沿用抢劫到第 i-1 个房屋时的最大金额。
  1. 选择较大值:

对于第 i 个房屋,我们选择抢劫或不抢劫所获得的金额中的较大值作为 dp[i] 的值。

  1. 返回结果:

当计算完整个动态规划表后,我们将返回 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 题:打家劫舍,是一个经典的动态规划问题。通过将问题分解成若干个子问题,并使用动态规划表来存储子问题的解,我们可以有效地求得整个问题的最优解。算法之美在于其能够将复杂问题简化为一系列简单的问题,并通过逐步求解这些简单问题来得到整个问题的解。这种方法不仅适用于「打家劫舍」问题,也适用于许多其他现实世界的优化问题。