代码随想录算法训练营第三十四天 | 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]
}
  • 情况一:偷中间,不偷首尾
  • 情况二:偷中间+首或尾
  • 情况二其实包含了情况一,因为dpi的含义是考虑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类型)有两个状态。

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

相关推荐
rannn_1116 分钟前
【力扣hot100】链表专题|21、2、19、24、92、25
java·数据结构·算法·leetcode·链表·开发
Gust of wind16 分钟前
数据结构基础:线性表及其存储实现
数据结构
SNAKEpc1213827 分钟前
OpenGL(十五)- 着色器语言GLSL
c语言·c++·线性代数·算法·矩阵·图形渲染·着色器
AI服务老曹28 分钟前
AI视频分析API完整流程:设备、算法与告警接口接入指南
人工智能·算法·音视频
鹿角片ljp31 分钟前
LeetCode 21. 合并两个有序链表
算法·leetcode·链表
Rabitebla1 小时前
C++11 新特性详解(一):列表初始化、initializer_list 与右值引用
java·开发语言·数据结构·c++·算法·leetcode·list
XMAIPC_Robot1 小时前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
天吾cc1 小时前
RTT-MQTT
网络·单片机·嵌入式硬件·算法
vivo互联网技术1 小时前
MagicBokeh:单步统一生成式框架实现真实感长焦虚化渲染 | CVPR 2026 Oral
人工智能·算法
lucas_AI2 小时前
Grok 4.6:追平 GPT-5.6 Sol 的半价旗舰,但别只看跑分
人工智能·算法