mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Update 0198.打家劫舍.md
This commit is contained in:
@ -166,30 +166,64 @@ class Solution {
|
|||||||
```
|
```
|
||||||
|
|
||||||
Python:
|
Python:
|
||||||
|
1维DP
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def rob(self, nums: List[int]) -> int:
|
def rob(self, nums: List[int]) -> int:
|
||||||
if len(nums) == 0:
|
if len(nums) == 0: # 如果没有房屋,返回0
|
||||||
return 0
|
return 0
|
||||||
if len(nums) == 1:
|
if len(nums) == 1: # 如果只有一个房屋,返回其金额
|
||||||
return nums[0]
|
return nums[0]
|
||||||
|
|
||||||
|
# 创建一个动态规划数组,用于存储最大金额
|
||||||
dp = [0] * len(nums)
|
dp = [0] * len(nums)
|
||||||
dp[0] = nums[0]
|
dp[0] = nums[0] # 将dp的第一个元素设置为第一个房屋的金额
|
||||||
dp[1] = max(nums[0], nums[1])
|
dp[1] = max(nums[0], nums[1]) # 将dp的第二个元素设置为第一二个房屋中的金额较大者
|
||||||
|
|
||||||
|
# 遍历剩余的房屋
|
||||||
for i in range(2, len(nums)):
|
for i in range(2, len(nums)):
|
||||||
dp[i] = max(dp[i-2]+nums[i], dp[i-1])
|
# 对于每个房屋,选择抢劫当前房屋和抢劫前一个房屋的最大金额
|
||||||
return dp[-1]
|
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
|
||||||
|
|
||||||
|
return dp[-1] # 返回最后一个房屋中可抢劫的最大金额
|
||||||
```
|
```
|
||||||
|
2维DP
|
||||||
```python
|
```python
|
||||||
class Solution: # 二维dp数组写法
|
class Solution:
|
||||||
def rob(self, nums: List[int]) -> int:
|
def rob(self, nums: List[int]) -> int:
|
||||||
dp = [[0,0] for _ in range(len(nums))]
|
if not nums: # 如果没有房屋,返回0
|
||||||
dp[0][1] = nums[0]
|
return 0
|
||||||
for i in range(1,len(nums)):
|
|
||||||
dp[i][0] = max(dp[i-1][1],dp[i-1][0])
|
n = len(nums)
|
||||||
dp[i][1] = dp[i-1][0]+nums[i]
|
dp = [[0, 0] for _ in range(n)] # 创建二维动态规划数组,dp[i][0]表示不抢劫第i个房屋的最大金额,dp[i][1]表示抢劫第i个房屋的最大金额
|
||||||
print(dp)
|
|
||||||
return max(dp[-1])
|
dp[0][1] = nums[0] # 抢劫第一个房屋的最大金额为第一个房屋的金额
|
||||||
|
|
||||||
|
for i in range(1, n):
|
||||||
|
dp[i][0] = max(dp[i-1][0], dp[i-1][1]) # 不抢劫第i个房屋,最大金额为前一个房屋抢劫和不抢劫的最大值
|
||||||
|
dp[i][1] = dp[i-1][0] + nums[i] # 抢劫第i个房屋,最大金额为前一个房屋不抢劫的最大金额加上当前房屋的金额
|
||||||
|
|
||||||
|
return max(dp[n-1][0], dp[n-1][1]) # 返回最后一个房屋中可抢劫的最大金额
|
||||||
|
|
||||||
|
```
|
||||||
|
优化版
|
||||||
|
```python
|
||||||
|
class Solution:
|
||||||
|
def rob(self, nums: List[int]) -> int:
|
||||||
|
if not nums: # 如果没有房屋,返回0
|
||||||
|
return 0
|
||||||
|
|
||||||
|
prev_max = 0 # 上一个房屋的最大金额
|
||||||
|
curr_max = 0 # 当前房屋的最大金额
|
||||||
|
|
||||||
|
for num in nums:
|
||||||
|
temp = curr_max # 临时变量保存当前房屋的最大金额
|
||||||
|
curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额
|
||||||
|
prev_max = temp # 更新上一个房屋的最大金额
|
||||||
|
|
||||||
|
return curr_max # 返回最后一个房屋中可抢劫的最大金额
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
Go:
|
Go:
|
||||||
```Go
|
```Go
|
||||||
|
Reference in New Issue
Block a user