Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c33556c

Browse files
Update 0198.打家劫舍.md
1 parent bdedd2d commit c33556c

File tree

1 file changed

+48
-14
lines changed

1 file changed

+48
-14
lines changed

‎problems/0198.打家劫舍.md‎

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,30 +166,64 @@ class Solution {
166166
```
167167

168168
Python:
169+
1维DP
169170
```python
170171
class Solution:
171172
def rob(self, nums: List[int]) -> int:
172-
if len(nums) == 0:
173+
if len(nums) == 0:# 如果没有房屋,返回0
173174
return 0
174-
if len(nums) == 1:
175+
if len(nums) == 1:# 如果只有一个房屋,返回其金额
175176
return nums[0]
177+
178+
# 创建一个动态规划数组,用于存储最大金额
176179
dp = [0] * len(nums)
177-
dp[0] = nums[0]
178-
dp[1] = max(nums[0], nums[1])
180+
dp[0] = nums[0] # 将dp的第一个元素设置为第一个房屋的金额
181+
dp[1] = max(nums[0], nums[1]) # 将dp的第二个元素设置为第一二个房屋中的金额较大者
182+
183+
# 遍历剩余的房屋
179184
for i in range(2, len(nums)):
180-
dp[i] = max(dp[i-2]+nums[i], dp[i-1])
181-
return dp[-1]
185+
# 对于每个房屋,选择抢劫当前房屋和抢劫前一个房屋的最大金额
186+
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
187+
188+
return dp[-1] # 返回最后一个房屋中可抢劫的最大金额
189+
```
190+
2维DP
191+
```python
192+
class Solution:
193+
def rob(self, nums: List[int]) -> int:
194+
if not nums: # 如果没有房屋,返回0
195+
return 0
196+
197+
n = len(nums)
198+
dp = [[0, 0] for _ in range(n)] # 创建二维动态规划数组,dp[i][0]表示不抢劫第i个房屋的最大金额,dp[i][1]表示抢劫第i个房屋的最大金额
199+
200+
dp[0][1] = nums[0] # 抢劫第一个房屋的最大金额为第一个房屋的金额
201+
202+
for i in range(1, n):
203+
dp[i][0] = max(dp[i-1][0], dp[i-1][1]) # 不抢劫第i个房屋,最大金额为前一个房屋抢劫和不抢劫的最大值
204+
dp[i][1] = dp[i-1][0] + nums[i] # 抢劫第i个房屋,最大金额为前一个房屋不抢劫的最大金额加上当前房屋的金额
205+
206+
return max(dp[n-1][0], dp[n-1][1]) # 返回最后一个房屋中可抢劫的最大金额
207+
182208
```
209+
优化版
183210
```python
184-
class Solution:# 二维dp数组写法
211+
class Solution:
185212
def rob(self, nums: List[int]) -> int:
186-
dp = [[0,0] for _ in range(len(nums))]
187-
dp[0][1] = nums[0]
188-
for i in range(1,len(nums)):
189-
dp[i][0] = max(dp[i-1][1],dp[i-1][0])
190-
dp[i][1] = dp[i-1][0]+nums[i]
191-
print(dp)
192-
return max(dp[-1])
213+
if not nums: # 如果没有房屋,返回0
214+
return 0
215+
216+
prev_max = 0 # 上一个房屋的最大金额
217+
curr_max = 0 # 当前房屋的最大金额
218+
219+
for num in nums:
220+
temp = curr_max # 临时变量保存当前房屋的最大金额
221+
curr_max = max(prev_max + num, curr_max) # 更新当前房屋的最大金额
222+
prev_max = temp # 更新上一个房屋的最大金额
223+
224+
return curr_max # 返回最后一个房屋中可抢劫的最大金额
225+
226+
193227
```
194228
Go:
195229
```Go

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /