3840. House Robber V
Description
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed and is protected by a security system with a color code.
You are given two integer arrays nums and colors, both of length n, where nums[i] is the amount of money in the ith house and colors[i] is the color code of that house.
You cannot rob two adjacent houses if they share the same color code.
Return the maximum amount of money you can rob.
Example 1:
Input: nums = [1,4,3,5], colors = [1,1,2,2]
Output: 9
Explanation:
- Choose houses
i = 1withnums[1] = 4andi = 3withnums[3] = 5because they are non-adjacent. - Thus, the total amount robbed is
4 + 5 = 9.
Example 2:
Input: nums = [3,1,2,4], colors = [2,3,2,2]
Output: 8
Explanation:
- Choose houses
i = 0withnums[0] = 3,i = 1withnums[1] = 1, andi = 3withnums[3] = 4. - This selection is valid because houses
i = 0andi = 1have different colors, and housei = 3is non-adjacent toi = 1. - Thus, the total amount robbed is
3 + 1 + 4 = 8.
Example 3:
Input: nums = [10,1,3,9], colors = [1,1,1,2]
Output: 22
Explanation:
- Choose houses
i = 0withnums[0] = 10,i = 2withnums[2] = 3, andi = 3withnums[3] = 9. - This selection is valid because houses
i = 0andi = 2are non-adjacent, and housesi = 2andi = 3have different colors. - Thus, the total amount robbed is
10 + 3 + 9 = 22.
Constraints:
1 <= n == nums.length == colors.length <= 1051 <= nums[i], colors[i] <= 105
Solutions
Solution 1: Dynamic Programming
Thinking
Adjacent houses of the same color cannot both be robbed; different colors have no such ban. \(n \le 10^5\) needs a linear DP.
The usual rob/skip transition still holds for equal colors; for different colors the current house may follow a robbed previous house.
Let \(f,g\) be the best skip/rob amounts after the previous house. Same color: \(g\) comes only from old \(f\). Different colors: \(g\) comes from \(\max(f,g)\).
Two rolling variables suffice; the answer is their maximum.
We define two variables \(f\) and \(g\), where \(f\) represents the maximum amount when the current house is not robbed, and \(g\) represents the maximum amount when the current house is robbed. Initially, \(f = 0\) and \(g = nums[0]\). The answer is \(\max(f, g)\).
Next, we traverse starting from the second house:
- If the current house has the same color as the previous house, then \(f\) is updated to \(\max(f, g)\), and \(g\) is updated to \(f + nums[i]\).
- If the current house has a different color from the previous house, then \(f\) is updated to \(\max(f, g)\), and \(g\) is updated to \(\max(f, g) + nums[i]\).
Finally, return \(\max(f, g)\).
The time complexity is \(O(n)\), where \(n\) is the number of houses. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |