213. 打家劫舍 II
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
考察重点:动态规划
方法概括:(本是线性查找,头尾相连后如何解决) 同198,只需在此基础上分为0-n-1与1-n两次查找即可
func findMax(nums []int) int {max := -1for i := 0; i < len(nums); i++ {if max < nums[i] {max = nums[i]}}return max
}func Rob(nums []int) int {max := -1if len(nums) <= 3 { //数组长度小于3,返回最大值return findMax(nums)}nums1 := make([]int, len(nums)) //一共进行两次不相关的遍历,分别从0-n-1与1-n,比较得到两数组中的最大值,就是返回结果copy(nums1, nums[:])nums1[1] = int(math.Max(float64(nums1[0]), float64(nums1[1])))for i := 2; i < len(nums)-1; i++ {nums1[i] = int(math.Max(float64(nums1[i-1]), float64(nums1[i-2]+nums1[i])))max = int(math.Max(float64(nums1[i]), float64(max)))}nums[2] = int(math.Max(float64(nums[1]), float64(nums[2])))for i := 3; i < len(nums); i++ {nums[i] = int(math.Max(float64(nums[i-1]), float64(nums[i-2]+nums[i])))max = int(math.Max(float64(nums[i]), float64(max)))}return max
}