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

相关推荐
算法与编程之美8 分钟前
解决tensor的shape不为1,如何转移到CPU的问题
人工智能·python·深度学习·算法·机器学习
natide9 分钟前
词汇/表达差异-8-Token Overlap(词元重叠度)
大数据·人工智能·深度学习·算法·自然语言处理·nlp·知识图谱
hetao173383712 分钟前
2025-12-22 hetao1733837的笔记
c++·笔记·算法
云技纵横20 分钟前
Redis 数据结构底层与 Hash 优于 JSON 的工程实践
数据结构·redis·哈希算法
Binky67827 分钟前
力扣--贪心篇(1)
数据结构·算法·leetcode
sinat_2554878127 分钟前
文件I/O流
java·jvm·算法
北辰水墨29 分钟前
【算法篇】单调栈的学习
c++·笔记·学习·算法·单调栈
源代码•宸30 分钟前
goframe框架签到系统项目开发(分布式 ID 生成器、雪花算法、抽离业务逻辑到service层)
经验分享·分布式·mysql·算法·golang·雪花算法·goframe
AIpanda88832 分钟前
当智能化工具应用于企业,如何借助AI销冠系统提升工作效率?
算法
进击的小头37 分钟前
01_嵌入式C与控制理论入门:从原理到MCU实战落地
c语言·单片机·算法