代码随想录算法训练营第47天|● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

发布时间:2023年12月25日

198. 打家劫舍

已解答
中等
相关标签
相关企业
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

代码

package __DP

func rob(nums []int) int {
   n := len(nums)
   // 到达i,盗窃最高金额dp[i]
   dp := make([]int, n)
   dp[0] = nums[0]
   dp[1] = rob_max(nums[0],nums[1])
   for i := 2; i < n; i++ {
      dp[i] = rob_max(dp[i-1], dp[i-2]+nums[i])
   }
   return dp[n-1]
}

func rob_max(i int, i2 int) int {
   if i > i2 {
      return i
   }
   return i2
}

213. 打家劫舍 II

已解答
中等
相关标签
相关企业
提示
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:
输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:
输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 3:
输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

代码

package __dp

func rob_ii(nums []int) int {
   /*
      两次,[0,n-1],[1,n]
   */
   n := len(nums)
   if n == 1 {
      return nums[0]
   } else if n == 2 {
      return max(nums[0], nums[1])
   }

   dp, dp1 := make([]int, n-1), make([]int, n)
   dp[0] = nums[0]
   dp[1] = max(nums[0], nums[1])
   for i := 2; i < n-1; i++ {
      dp[i] = max(dp[i-2]+nums[i], dp[i-1])
   }

   dp1[0] = nums[1] // 修改此行
   dp1[1] = max(nums[1], nums[2])
   for i := 2; i < n-1; i++ {
      dp1[i] = max(dp1[i-2]+nums[i+1], dp1[i-1]) // 修改此行
   }

   return max(dp[n-2], dp1[n-2]) // 修改此行
}

337. 打家劫舍 III

已解答
中等
相关标签
相关企业
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。
除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

示例 1:
[图片]
输入: root = [3,2,3,null,3,null,1]
输出: 7
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7
示例 2:
[图片]
输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 10(4)] 范围内
  • 0 <= Node.val <= 10(4)

思路

  • 与198.打家劫舍,213.打家劫舍II一样,关键是要讨论当前节点抢还是不抢。
  • 如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子(注意这里说的是“考虑”)
文章来源:https://blog.csdn.net/qq_41735944/article/details/135196863
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。