代码随想录算法训练营第三十四天 | 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是 有两个状态的数组。

相关推荐
地平线开发者4 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮4 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者5 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考5 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx8 小时前
CART决策树基本原理
算法·机器学习
Wect9 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱9 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway16 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风16 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect16 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript