2828
2929<!-- 这里可写通用的实现逻辑 -->
3030
31+ 动态规划法。状态转移方程:` f(n) = Math.max(f(n - 2) + nums[n], nums[n - 1]) ` 。
32+
3133<!-- tabs:start -->
3234
3335### ** Python3**
3739``` python
3840class Solution :
3941 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
4049 if not nums:
4150 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 )
5052```
5153
5254### ** Java**
@@ -57,15 +59,15 @@ class Solution:
5759class Solution {
5860 public int rob (int [] nums ) {
5961 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) {
6971 int t = Math . max(pre + nums[i], cur);
7072 pre = cur;
7173 cur = t;
@@ -75,6 +77,62 @@ class Solution {
7577}
7678```
7779
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+
78136### ** ...**
79137
80138```
0 commit comments