一个专业的小偷,计划偷窃一个环形街道上沿街的房屋,每间房内都藏有一定的现金。
这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。
同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
示例 1:输入:nums = [2,3,2] 输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:输入:nums = [1,2,3,1] 输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 3:输入:nums = [0] 输出:0
提示:1 <= nums.length <= 100
0 <= nums[i] <= 1000
注意:本题与主站 213 题相同:
1、动态规划;时间复杂度O(n),空间复杂度O(n)
func rob(nums []int) int {
n := len(nums)
if n == 0 {
return 0
} else if n == 1 {
return nums[0]
}
dp1 := make([]int, n) // 从第一家开始打劫,最后一家不可选
dp2 := make([]int, n) // 从第二家开始打劫,最后一家可以选
dp1[0] = nums[0]
dp1[1] = max(nums[0], nums[1])
dp2[0] = 0
dp2[1] = nums[1]
for i := 2; i < n; i++ {
dp1[i] = max(dp1[i-1], dp1[i-2]+nums[i])
dp2[i] = max(dp2[i-1], dp2[i-2]+nums[i])
}
return max(dp1[n-2], dp2[n-1])
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
2、动态规划;时间复杂度O(n),空间复杂度O(n)
func rob(nums []int) int {
n := len(nums)
if n == 0 {
return 0
} else if n == 1 {
return nums[0]
} else if n == 2 {
return max(nums[0], nums[1])
}
return max(getMax(nums[:n-1]), getMax(nums[1:]))
}
func getMax(nums []int) int {
n := len(nums)
dp := make([]int, n+1)
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i := 2; i < n; i++ {
dp[i] = max(dp[i-1], dp[i-2]+nums[i])
}
return dp[n-1]
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
3、动态规划;时间复杂度O(n),空间复杂度O(1)
func rob(nums []int) int {
n := len(nums)
if n == 0 {
return 0
} else if n == 1 {
return nums[0]
} else if n == 2 {
return max(nums[0], nums[1])
}
return max(getMax(nums[:n-1]), getMax(nums[1:]))
}
func getMax(nums []int) int {
var a, b int
for i, v := range nums {
if i%2 == 0 {
a = max(a+v, b)
} else {
b = max(a, b+v)
}
}
return max(a, b)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
Medium题目,题目同leetcode 213.打家劫舍II;类似的题目有leetcode 1388.3n块披萨
页面更新:2024-05-23
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号