diff --git a/problems/0213.打家劫舍II.md b/problems/0213.打家劫舍II.md index 6f753a72..3d7470f7 100644 --- a/problems/0213.打家劫舍II.md +++ b/problems/0213.打家劫舍II.md @@ -166,7 +166,41 @@ const robRange = (nums, start, end) => { } ``` Go: +```go +// 打家劫舍Ⅱ 动态规划 +// 时间复杂度O(n) 空间复杂度O(n) +func rob(nums []int) int { + if len(nums) == 1 { + return nums[0] + } + if len(nums) == 2 { + return max(nums[0], nums[1]) + } + + result1 := robRange(nums, 0) + result2 := robRange(nums, 1) + return max(result1, result2) +} +// 偷盗指定的范围 +func robRange(nums []int, start int) int { + dp := make([]int, len(nums)) + dp[1] = nums[start] + + for i := 2; i < len(nums); i++ { + dp[i] = max(dp[i - 2] + nums[i - 1 + start], dp[i - 1]) + } + + return dp[len(nums) - 1] +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +``` diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index 79b3b485..d04d19d1 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -430,6 +430,35 @@ const rob = root => { }; ``` +Go: +```go +// 打家劫舍Ⅲ 动态规划 +// 时间复杂度O(n) 空间复杂度O(logn) +func rob(root *TreeNode) int { + dp := traversal(root) + return max(dp[0], dp[1]) +} + +func traversal(cur *TreeNode) []int { + if cur == nil { + return []int{0, 0} + } + + dpL := traversal(cur.Left) + dpR := traversal(cur.Right) + + val1 := cur.Val + dpL[0] + dpR[0] // 偷盗当前节点 + val2 := max(dpL[0], dpL[1]) + max(dpR[0], dpR[1]) // 不偷盗当前节点 + return []int{val2, val1} +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} +```