LeetCode 213. 打家劫舍 II
题目描述
思路分析
打家劫舍问题
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func robLinear(nums []int) int {
if len(nums) == 0 {
return 0
}
if len(nums) == 1 {
return nums[0]
}
// dp[i] 为偷到第 i 个房子时的最大收益
dp := make([]int, len(nums))
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i := 2; i < len(nums); i++ {
dp[i] = max(dp[i-1], dp[i-2]+nums[i])
}
return dp[len(nums)-1]
}
func rob(nums []int) int {
if len(nums) == 1 {
return nums[0]
}
// 偷窃第一个房屋,不偷窃最后一个房屋
case1 := robLinear(nums[:len(nums)-1])
// 不偷窃第一个房屋,偷窃最后一个房屋
case2 := robLinear(nums[1:])
return max(case1, case2)
}
- 时间复杂度:O(n),其中
n
是数组nums
的长度。- 空间复杂度:O(n),我们使用了一个大小为
n
的数组dp
。
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用