Update 0213.打家劫舍II.md

This commit is contained in:
jianghongcheng
2023-06-05 08:07:53 -05:00
committed by GitHub
parent bc13242925
commit 3b3d9c4d11

View File

@ -130,41 +130,94 @@ class Solution {
``` ```
Python Python
```Python ```Python
class Solution: class Solution:
def rob(self, nums: List[int]) -> int: def rob(self, nums: List[int]) -> int:
#在198入门级的打家劫舍问题上分两种情况考虑 if len(nums) == 0:
#一是不偷第一间房,二是不偷最后一间房 return 0
if len(nums)==1:#题目中提示nums.length>=1,所以不需要考虑len(nums)==0的情况 if len(nums) == 1:
return nums[0] return nums[0]
val1=self.roblist(nums[1:])#不偷第一间房
val2=self.roblist(nums[:-1])#不偷最后一间房
return max(val1,val2)
def roblist(self,nums): result1 = self.robRange(nums, 0, len(nums) - 2) # 情况二
l=len(nums) result2 = self.robRange(nums, 1, len(nums) - 1) # 情况三
dp=[0]*l return max(result1, result2)
dp[0]=nums[0] # 198.打家劫舍的逻辑
for i in range(1,l): def robRange(self, nums: List[int], start: int, end: int) -> int:
if i==1: if end == start:
dp[i]=max(dp[i-1],nums[i]) return nums[start]
else:
dp[i]=max(dp[i-1],dp[i-2]+nums[i]) prev_max = nums[start]
return dp[-1] curr_max = max(nums[start], nums[start + 1])
for i in range(start + 2, end + 1):
temp = curr_max
curr_max = max(prev_max + nums[i], curr_max)
prev_max = temp
return curr_max
``` ```
2维DP
```python ```python
class Solution: # 二维dp数组写法 class Solution:
def rob(self, nums: List[int]) -> int: def rob(self, nums: List[int]) -> int:
if len(nums)<3: return max(nums) if len(nums) < 3:
return max(self.default(nums[:-1]),self.default(nums[1:])) return max(nums)
def default(self,nums):
dp = [[0,0] for _ in range(len(nums))] # 情况二:不抢劫第一个房屋
result1 = self.robRange(nums[:-1])
# 情况三:不抢劫最后一个房屋
result2 = self.robRange(nums[1:])
return max(result1, result2)
def robRange(self, nums):
dp = [[0, 0] for _ in range(len(nums))]
dp[0][1] = nums[0] dp[0][1] = nums[0]
for i in range(1,len(nums)):
dp[i][0] = max(dp[i-1]) for i in range(1, len(nums)):
dp[i][1] = dp[i-1][0] + nums[i] dp[i][0] = max(dp[i - 1])
dp[i][1] = dp[i - 1][0] + nums[i]
return max(dp[-1]) return max(dp[-1])
```
优化版
```python
class Solution:
def rob(self, nums: List[int]) -> int:
if not nums: # 如果没有房屋返回0
return 0
if len(nums) == 1: # 如果只有一个房屋,返回该房屋的金额
return nums[0]
# 情况二:不抢劫第一个房屋
prev_max = 0 # 上一个房屋的最大金额
curr_max = 0 # 当前房屋的最大金额
for num in nums[1:]:
temp = curr_max # 临时变量保存当前房屋的最大金额
curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额
prev_max = temp # 更新上一个房屋的最大金额
result1 = curr_max
# 情况三:不抢劫最后一个房屋
prev_max = 0 # 上一个房屋的最大金额
curr_max = 0 # 当前房屋的最大金额
for num in nums[:-1]:
temp = curr_max # 临时变量保存当前房屋的最大金额
curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额
prev_max = temp # 更新上一个房屋的最大金额
result2 = curr_max
return max(result1, result2)
``` ```
Go Go