213. House Robber II
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have a security system connected, and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given an integer array nums representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.
Example 1:
Input: nums = [2,3,2]
Output: 3
Explanation: You cannot rob house 1 (money = 2) and then rob house 3 (money = 2), because they are adjacent houses.
Example 2:
Input: nums = [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
Example 3:
Input: nums = [1,2,3]
Output: 3
Constraints:
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 1000
Solution
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums) == 1:
return nums[0]
def getMaxAmount(arr: List[int]) -> int:
pre_rob = pre_robX = 0
cur_rob = cur_robX = 0
for i in range(len(arr)):
cur_rob = max(pre_robX + arr[i], cur_rob)
cur_robX = max(pre_rob, pre_robX)
pre_rob = cur_rob
pre_robX = cur_robX
return max(cur_rob, cur_robX)
return max(getMaxAmount(nums[:-1]), getMaxAmount(nums[1:]))
The easiest way to maximize the amount of money while considering the first and last elements is to split the array into two parts: one without the last element and the other without the first element. Then we simply maximize the amount of money for each part.
How to maximize the amount of money ?
When maximizing the amount of money at index `N` in the array, the problem becomes simpler if we assume that the maximum amount up to the previous index(`N-1`) has already been determined. It means there are two possible cases: whether the previous house was robbed or not. Then, we only need to decide whether robbing the house at index N will yield the maximum value.
'algo > leetcode' 카테고리의 다른 글
79. Word Search (0) | 2025.02.27 |
---|---|
39. Combination Sum (0) | 2025.02.18 |
121. Best Time to Buy and Sell Stock (0) | 2025.02.08 |
128. Longest Consecutive Sequence (0) | 2025.02.08 |
306. Additive Number (0) | 2025.01.27 |