LeetCode 213. 打家劫舍 II

题目描述

213. 打家劫舍 II

image-20250419064937610

思路分析

打家劫舍问题

image-20250510224549830

image-20250510224849181

参考代码

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

➡️ 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/89469061
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!