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

答案代码从1开始的,不用看了。

Go 复制代码
func rob(nums []int) int {
	n := len(nums)
	dp := make([]int, n)
	dp[0] = nums[0]
	if n == 1 {
		return nums[0]
	}
	dp[1] = max(nums[0], nums[1])
	for i := 2; i < n; i++ {
		dp[i] = max(dp[i-2]+nums[i], dp[i-1])
	}
	return dp[n-1]
}
  • 情况一:偷中间,不偷首尾
  • 情况二:偷中间+首或尾
  • 情况二其实包含了情况一,因为dp[i]的含义是考虑i,不一定非得偷i
Go 复制代码
// 把环形问题化解成线性问题
func rob(nums []int) int {
	if len(nums) == 1 {
		return nums[0]
	}
	resWithHead := robLine(nums[:len(nums)-1])
	resWithTail := robLine(nums[1:])
	return max(resWithHead, resWithTail)
}

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

数组是每个元素(int类型)有两个状态;同理,二叉树是每个结点(struct类型)有两个状态。

数组中dp[i]值 是 前几个元素的dp值 dp[i-1]和dp[i-2] ...的状态转移;二叉树中dpNode是子节点dpLeft和dpRight的状态转移,只不过dpNode是 有两个状态的数组。

相关推荐
用户992441031561 小时前
TRAE SOLO 赋能大模型工程化实践:从模型选型到安全部署的一站式实战指南
算法
goyeer1 小时前
05.[SAP ABAP] ABAP中的运算符
算法·sap·abap·运算符
NAGNIP1 小时前
面试官:BatchNorm、LayerNorm、GroupNorm、InstanceNorm 有什么本质区别?
算法·面试
Rock_yzh2 小时前
LeetCode算法刷题——560. 和为 K 的子数组
数据结构·c++·学习·算法·leetcode·职场和发展·哈希算法
水水不水啊2 小时前
通过一个域名,借助IPV6免费远程访问自己家里的设备
前端·python·算法
.格子衫.2 小时前
027动态规划之矩阵DP——算法备赛
算法·矩阵·动态规划
nju_spy2 小时前
力扣每日一题(11.10-11.29)0-1 和 k 整除系列
python·算法·leetcode·前缀和·单调栈·最大公约数·0-1背包
roman_日积跬步-终至千里2 小时前
【模式识别与机器学习(8)】主要算法与技术(下篇:高级模型与集成方法)之 元学习
学习·算法·机器学习
haing20192 小时前
Bezier曲线曲率极值的计算方法
人工智能·算法·机器学习·曲率极值