28
28
29
29
<!-- 这里可写通用的实现逻辑 -->
30
30
31
+ 动态规划法。状态转移方程:` f(n) = Math.max(f(n - 2) + nums[n], nums[n - 1]) ` 。
32
+
31
33
<!-- tabs:start -->
32
34
33
35
### ** Python3**
37
39
``` python
38
40
class Solution :
39
41
def rob (self , nums : List[int ]) -> int :
42
+ def robRange (nums , start , end ):
43
+ if end - start == 0 :
44
+ return nums[start]
45
+ pre, cur = 0 , nums[start]
46
+ for i in range (start + 1 , end + 1 ):
47
+ pre, cur = cur, max (pre + nums[i], cur)
48
+ return cur
40
49
if not nums:
41
50
return 0
42
- n = len (nums)
43
- if n == 1 :
44
- return nums[0 ]
45
- pre, cur = nums[0 ], max (nums[0 ], nums[1 ])
46
- for i in range (2 , n):
47
- t = max (pre + nums[i], cur)
48
- pre, cur = cur, t
49
- return cur
51
+ return robRange(nums, 0 , len (nums) - 1 )
50
52
```
51
53
52
54
### ** Java**
@@ -57,15 +59,15 @@ class Solution:
57
59
class Solution {
58
60
public int rob (int [] nums ) {
59
61
int n;
60
- if (nums == null || (n = nums. length) == 0 ) {
61
- return 0 ;
62
- }
63
- if (n == 1 ) {
64
- return nums[ 0 ];
65
- }
66
- int pre = nums[ 0 ] ;
67
- int cur = Math . max( nums[0 ], nums[ 1 ]) ;
68
- for (int i = 2 ; i < n ; ++ i) {
62
+ if ((n = nums. length) == 0 ) return 0 ;
63
+ return robRange(nums, 0 , n - 1 ) ;
64
+ }
65
+
66
+ private int robRange ( int [] nums , int start , int end ) {
67
+ if (end - start == 0 ) return nums[start];
68
+ int pre = 0 ;
69
+ int cur = nums[start] ;
70
+ for (int i = start + 1 ; i < end + 1 ; ++ i) {
69
71
int t = Math . max(pre + nums[i], cur);
70
72
pre = cur;
71
73
cur = t;
@@ -75,6 +77,62 @@ class Solution {
75
77
}
76
78
```
77
79
80
+ ### ** C++**
81
+
82
+ ``` cpp
83
+ class Solution {
84
+ public:
85
+ int rob(vector<int >& nums) {
86
+ int n;
87
+ if ((n = nums.size()) == 0) return 0;
88
+ return robRange(nums, 0, n - 1);
89
+ }
90
+
91
+ private:
92
+ int robRange(vector<int >& nums, int start, int end) {
93
+ if (end - start == 0) return nums[ start] ;
94
+ int pre = 0;
95
+ int cur = nums[ start] ;
96
+ for (int i = start + 1; i < end + 1; ++i) {
97
+ int t = max(pre + nums[ i] , cur);
98
+ pre = cur;
99
+ cur = t;
100
+ }
101
+ return cur;
102
+ }
103
+ };
104
+ ```
105
+
106
+ ### **Go**
107
+
108
+ ```go
109
+ func rob(nums []int) int {
110
+ n := len(nums)
111
+ if n == 0 {
112
+ return 0
113
+ }
114
+ return robRange(nums, 0, n - 1)
115
+ }
116
+
117
+ func robRange(nums[]int, start int, end int) int {
118
+ if end - start == 0 {
119
+ return nums[start]
120
+ }
121
+ pre, cur := 0, nums[start]
122
+ for i := start + 1; i < end + 1; i++ {
123
+ pre, cur = cur, max(pre + nums[i], cur)
124
+ }
125
+ return cur
126
+ }
127
+
128
+ func max(a, b int) int {
129
+ if (a > b) {
130
+ return a
131
+ }
132
+ return b
133
+ }
134
+ ```
135
+
78
136
### ** ...**
79
137
80
138
```
0 commit comments