213. 打家劫舍 II golang 动态规划

本文详细解析了LeetCode上213题打家劫舍II的算法思路及Go语言实现,探讨如何在不触动警报的情况下,计算能够偷窃到的最高金额。通过对比首尾相连和不相连两种情况下的最大值,找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

213. 打家劫舍 II
198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

解法

主要是理解不让首尾相连是什么意思!
第一个元素到倒数第二个元素的最大值 m
第二个元素到倒数第一元素的最大值 n

代码

func rob(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	if len(nums) == 1 {
		return nums[0]
	}
	m := rob_one_nine_eight(nums[1:len(nums)])
	n := rob_one_nine_eight(nums[0:len(nums)-1])
	fmt.Println(m,n)
	if m > n {
		return m
	}
	return n
	//fmt.Println(nums[1:len(nums)])
	//fmt.Println(nums[0:len(nums)-1])
}

func rob_one_nine_eight(nums []int) int {
	curr := 0
	prev := 0
	for _, key := range nums {
		temp := curr
		curr = max(prev+key, curr)
		prev = temp
	}
	return curr
}

func max(n, m int) int {
	if n > m {
		return n
	} else {
		return m
	}
}

作者:HodgeKou
链接:https://leetcode-cn.com/problems/house-robber-ii/solution/go-213-by-hodgekou/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值