mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 04:54:51 +08:00
Update 0213.打家劫舍II.md
This commit is contained in:
@ -130,40 +130,93 @@ class Solution {
|
||||
```
|
||||
|
||||
Python:
|
||||
|
||||
```Python
|
||||
class Solution:
|
||||
def rob(self, nums: List[int]) -> int:
|
||||
#在198入门级的打家劫舍问题上分两种情况考虑
|
||||
#一是不偷第一间房,二是不偷最后一间房
|
||||
if len(nums)==1:#题目中提示nums.length>=1,所以不需要考虑len(nums)==0的情况
|
||||
if len(nums) == 0:
|
||||
return 0
|
||||
if len(nums) == 1:
|
||||
return nums[0]
|
||||
val1=self.roblist(nums[1:])#不偷第一间房
|
||||
val2=self.roblist(nums[:-1])#不偷最后一间房
|
||||
return max(val1,val2)
|
||||
|
||||
result1 = self.robRange(nums, 0, len(nums) - 2) # 情况二
|
||||
result2 = self.robRange(nums, 1, len(nums) - 1) # 情况三
|
||||
return max(result1, result2)
|
||||
# 198.打家劫舍的逻辑
|
||||
def robRange(self, nums: List[int], start: int, end: int) -> int:
|
||||
if end == start:
|
||||
return nums[start]
|
||||
|
||||
prev_max = nums[start]
|
||||
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
|
||||
|
||||
def roblist(self,nums):
|
||||
l=len(nums)
|
||||
dp=[0]*l
|
||||
dp[0]=nums[0]
|
||||
for i in range(1,l):
|
||||
if i==1:
|
||||
dp[i]=max(dp[i-1],nums[i])
|
||||
else:
|
||||
dp[i]=max(dp[i-1],dp[i-2]+nums[i])
|
||||
return dp[-1]
|
||||
```
|
||||
2维DP
|
||||
```python
|
||||
class Solution: # 二维dp数组写法
|
||||
class Solution:
|
||||
def rob(self, nums: List[int]) -> int:
|
||||
if len(nums)<3: return max(nums)
|
||||
return max(self.default(nums[:-1]),self.default(nums[1:]))
|
||||
def default(self,nums):
|
||||
dp = [[0,0] for _ in range(len(nums))]
|
||||
if len(nums) < 3:
|
||||
return max(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]
|
||||
for i in range(1,len(nums)):
|
||||
dp[i][0] = max(dp[i-1])
|
||||
dp[i][1] = dp[i-1][0] + nums[i]
|
||||
|
||||
for i in range(1, len(nums)):
|
||||
dp[i][0] = max(dp[i - 1])
|
||||
dp[i][1] = dp[i - 1][0] + nums[i]
|
||||
|
||||
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:
|
||||
|
Reference in New Issue
Block a user