File tree Expand file tree Collapse file tree 19 files changed +532
-30
lines changed
Course Code (C++)/04-House-Robber Expand file tree Collapse file tree 19 files changed +532
-30
lines changed Original file line number Diff line number Diff line change @@ -3,5 +3,5 @@ project(04_House_Robber)
3
3
4
4
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
5
5
6
- set (SOURCE_FILES main4 .cpp )
6
+ set (SOURCE_FILES main5 .cpp )
7
7
add_executable (04_House_Robber ${SOURCE_FILES} )
Original file line number Diff line number Diff line change 3
3
4
4
using namespace std ;
5
5
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 记忆化搜索
9
+ // / 时间复杂度: O(n^2)
10
+ // / 空间复杂度: O(n)
6
11
class Solution {
12
+
7
13
private:
8
14
// memo[i] 表示考虑抢劫 nums[i...n) 所能获得的最大收益
9
15
vector<int > memo;
10
16
11
17
// 考虑抢劫nums[index...nums.size())这个范围的所有房子
12
- int tryRob ( vector<int > &nums, int index){
18
+ int tryRob (const vector<int > &nums, int index){
13
19
14
- if ( index >= nums.size () )
20
+ if (index >= nums.size ())
15
21
return 0 ;
16
22
17
- if ( memo[index] != -1 )
23
+ if (memo[index] != -1 )
18
24
return memo[index];
19
25
20
26
int res = 0 ;
21
- for ( int i = index ; i < nums.size () ; i ++ )
22
- res = max (res, nums[i] + tryRob (nums, i+ 2 ));
27
+ for (int i = index ; i < nums.size () ; i ++)
28
+ res = max (res, nums[i] + tryRob (nums, i + 2 ));
23
29
memo[index] = res;
24
30
return res;
25
31
}
32
+
26
33
public:
27
34
int rob (vector<int >& nums) {
28
35
29
- memo = vector<int >(nums.size (), -1 );
36
+ memo.clear ();
37
+ for (int i = 0 ; i < nums.size () ; i ++)
38
+ memo.push_back (-1 );
30
39
return tryRob (nums, 0 );
31
40
}
32
41
};
33
42
34
43
int main () {
35
44
45
+ int nums[] = {2 , 1 };
46
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
47
+
48
+ cout << Solution ().rob (vec) << endl;
49
+
36
50
return 0 ;
37
51
}
Original file line number Diff line number Diff line change 3
3
4
4
using namespace std ;
5
5
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 动态规划
9
+ // / 时间复杂度: O(n^2)
10
+ // / 空间复杂度: O(n)
6
11
class Solution {
7
12
8
13
public:
9
14
int rob (vector<int >& nums) {
10
15
11
16
int n = nums.size ();
12
17
13
- if ( n == 0 )
18
+ if (n == 0 )
14
19
return 0 ;
15
20
16
21
// memo[i] 表示考虑抢劫 nums[i...n) 所能获得的最大收益
17
22
vector<int > memo (n, 0 );
18
- memo[n- 1 ] = nums[n- 1 ];
19
- for ( int i = n- 2 ; i >= 0 ; i -- )
23
+ memo[n - 1 ] = nums[n - 1 ];
24
+ for (int i = n - 2 ; i >= 0 ; i --)
20
25
for (int j = i; j < n; j++)
21
- memo[i] = max (memo[i], nums[j] + (j + 2 < n ? memo[j + 2 ] : 0 ) );
26
+ memo[i] = max (memo[i],
27
+ nums[j] + (j + 2 < n ? memo[j + 2 ] : 0 ));
22
28
23
29
return memo[0 ];
24
30
}
@@ -27,9 +33,9 @@ class Solution {
27
33
int main () {
28
34
29
35
int nums[] = {2 ,1 };
30
- vector<int > vec (nums, nums+ sizeof (nums)/sizeof (int ));
36
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
31
37
32
- cout<< Solution ().rob (vec)<< endl;
38
+ cout << Solution ().rob (vec) << endl;
33
39
34
40
return 0 ;
35
41
}
Original file line number Diff line number Diff line change 3
3
4
4
using namespace std ;
5
5
6
- // 改变状态定义
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 记忆化搜索, 改变状态定义
9
+ // / 时间复杂度: O(n^2)
10
+ // / 空间复杂度: O(n)
7
11
class Solution {
12
+
8
13
private:
9
14
// memo[i] 表示考虑抢劫 nums[0...i] 所能获得的最大收益
10
15
vector<int > memo;
11
16
12
17
// 考虑抢劫nums[0...index]这个范围的所有房子
13
- int tryRob ( vector<int > &nums, int index){
18
+ int tryRob (const vector<int > &nums, int index){
14
19
15
- if ( index < 0 )
20
+ if (index < 0 )
16
21
return 0 ;
17
22
18
- if ( memo[index] != -1 )
23
+ if (memo[index] != -1 )
19
24
return memo[index];
20
25
21
26
int res = 0 ;
22
- for ( int i = 0 ; i <= index ; i ++ )
23
- res = max (res, nums[i] + tryRob (nums, i- 2 ));
27
+ for (int i = 0 ; i <= index ; i ++)
28
+ res = max (res, nums[i] + tryRob (nums, i - 2 ));
24
29
memo[index] = res;
25
30
return res;
26
31
}
32
+
27
33
public:
28
34
int rob (vector<int >& nums) {
29
35
30
- memo = vector<int >(nums.size (), -1 );
36
+ memo.clear ();
37
+ for (int i = 0 ; i < nums.size () ; i ++)
38
+ memo.push_back (-1 );
31
39
return tryRob (nums, nums.size () - 1 );
32
40
}
33
41
};
34
42
35
43
int main () {
36
44
45
+ int nums[] = {2 , 1 };
46
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
47
+
48
+ cout << Solution ().rob (vec) << endl;
49
+
37
50
return 0 ;
38
51
}
Original file line number Diff line number Diff line change 3
3
4
4
using namespace std ;
5
5
6
- // 改变状态定义
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 动态规划, 改变状态定义
9
+ // / 时间复杂度: O(n^2)
10
+ // / 空间复杂度: O(n)
7
11
class Solution {
8
12
9
13
public:
@@ -16,20 +20,21 @@ class Solution {
16
20
// memo[i] 表示考虑抢劫 nums[0...i] 所能获得的最大收益
17
21
vector<int > memo (n, 0 );
18
22
memo[0 ] = nums[0 ];
19
- for ( int i = 1 ; i < n ; i ++ )
23
+ for (int i = 1 ; i < n ; i ++)
20
24
for (int j = i; j >= 0 ; j--)
21
- memo[i] = max (memo[i], nums[j] + (j - 2 >= 0 ? memo[j - 2 ] : 0 ) );
25
+ memo[i] = max (memo[i],
26
+ nums[j] + (j - 2 >= 0 ? memo[j - 2 ] : 0 ));
22
27
23
28
return memo[n-1 ];
24
29
}
25
30
};
26
31
27
32
int main () {
28
33
29
- int nums[] = {2 ,1 };
30
- vector<int > vec (nums, nums+ sizeof (nums)/sizeof (int ));
34
+ int nums[] = {2 , 1 };
35
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
31
36
32
- cout<< Solution ().rob (vec)<< endl;
37
+ cout << Solution ().rob (vec) << endl;
33
38
34
39
return 0 ;
35
40
}
Original file line number Diff line number Diff line change
1
+ #include < iostream>
2
+ #include < vector>
3
+
4
+ using namespace std ;
5
+
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 记忆化搜索, 优化状态转移
9
+ // / 时间复杂度: O(n)
10
+ // / 空间复杂度: O(n)
11
+ class Solution {
12
+ private:
13
+ // memo[i] 表示考虑抢劫 nums[i...n) 所能获得的最大收益
14
+ vector<int > memo;
15
+
16
+ // 考虑抢劫nums[index...nums.size())这个范围的所有房子
17
+ int tryRob (const vector<int > &nums, int index){
18
+
19
+ if (index >= nums.size ())
20
+ return 0 ;
21
+
22
+ if (memo[index] != -1 )
23
+ return memo[index];
24
+
25
+ // 或者当前房子放弃, 从下一个房子开始考虑
26
+ // 或者抢劫当前的房子, 从i+2以后的房子开始考虑
27
+ return memo[index] = max (tryRob (nums, index + 1 ),
28
+ nums[index] + tryRob (nums, index + 2 ));
29
+ }
30
+
31
+ public:
32
+ int rob (vector<int >& nums) {
33
+
34
+ memo.clear ();
35
+ for (int i = 0 ; i < nums.size () ; i ++)
36
+ memo.push_back (-1 );
37
+ return tryRob (nums, 0 );
38
+ }
39
+ };
40
+
41
+ int main () {
42
+
43
+ int nums[] = {2 , 1 };
44
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
45
+
46
+ cout << Solution ().rob (vec) << endl;
47
+
48
+ return 0 ;
49
+ }
Original file line number Diff line number Diff line change
1
+ #include < iostream>
2
+ #include < vector>
3
+
4
+ using namespace std ;
5
+
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 动态规划, 优化状态转移
9
+ // / 时间复杂度: O(n)
10
+ // / 空间复杂度: O(n)
11
+ class Solution {
12
+
13
+ public:
14
+ int rob (vector<int >& nums) {
15
+
16
+ int n = nums.size ();
17
+
18
+ if (n == 0 )
19
+ return 0 ;
20
+
21
+ // memo[i] 表示考虑抢劫 nums[i...n) 所能获得的最大收益
22
+ vector<int > memo (n, 0 );
23
+ memo[n - 1 ] = nums[n - 1 ];
24
+ for (int i = n - 2 ; i >= 0 ; i --)
25
+ // 或者当前房子放弃, 从下一个房子开始考虑
26
+ // 或者抢劫当前的房子, 从i+2以后的房子开始考虑
27
+ memo[i] = max (memo[i + 1 ],
28
+ nums[i] + (i + 2 < n ? memo[i + 2 ] : 0 ));
29
+
30
+ return memo[0 ];
31
+ }
32
+ };
33
+
34
+ int main () {
35
+
36
+ int nums[] = {2 , 1 };
37
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
38
+
39
+ cout << Solution ().rob (vec) << endl;
40
+
41
+ return 0 ;
42
+ }
Original file line number Diff line number Diff line change
1
+ #include < iostream>
2
+ #include < vector>
3
+
4
+ using namespace std ;
5
+
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 记忆化搜索, 改变状态定义, 优化转移方程
9
+ // / 时间复杂度: O(n)
10
+ // / 空间复杂度: O(n)
11
+ class Solution {
12
+
13
+ private:
14
+ // memo[i] 表示考虑抢劫 nums[0...i] 所能获得的最大收益
15
+ vector<int > memo;
16
+
17
+ // 考虑抢劫nums[0...index]这个范围的所有房子
18
+ int tryRob (const vector<int > &nums, int index){
19
+
20
+ if (index < 0 )
21
+ return 0 ;
22
+
23
+ if (memo[index] != -1 )
24
+ return memo[index];
25
+
26
+ // 或者当前房子放弃, 考虑[0...index-1]的所有房子
27
+ // 或者抢劫当前的房子, 考虑[0...index-2]的所有房子
28
+ return memo[index] = max (tryRob (nums, index - 1 ),
29
+ nums[index] + tryRob (nums, index - 2 ));
30
+ }
31
+
32
+ public:
33
+ int rob (vector<int >& nums) {
34
+
35
+ memo.clear ();
36
+ for (int i = 0 ; i < nums.size () ; i ++)
37
+ memo.push_back (-1 );
38
+ return tryRob (nums, nums.size () - 1 );
39
+ }
40
+ };
41
+
42
+ int main () {
43
+
44
+ int nums[] = {2 , 1 };
45
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
46
+
47
+ cout << Solution ().rob (vec) << endl;
48
+
49
+ return 0 ;
50
+ }
Original file line number Diff line number Diff line change
1
+ #include < iostream>
2
+ #include < vector>
3
+
4
+ using namespace std ;
5
+
6
+ // / 198. House Robber
7
+ // / https://leetcode.com/problems/house-robber/description/
8
+ // / 动态规划, 改变状态定义, 优化转移方程
9
+ // / 时间复杂度: O(n)
10
+ // / 空间复杂度: O(n)
11
+ class Solution {
12
+
13
+ public:
14
+ int rob (vector<int >& nums) {
15
+
16
+ int n = nums.size ();
17
+ if ( n == 0 )
18
+ return 0 ;
19
+
20
+ // memo[i] 表示考虑抢劫 nums[0...i] 所能获得的最大收益
21
+ vector<int > memo (n, 0 );
22
+ memo[0 ] = nums[0 ];
23
+ for (int i = 1 ; i < n ; i ++)
24
+ memo[i] = max (memo[i - 1 ],
25
+ nums[i] + (i - 2 >= 0 ? memo[i - 2 ] : 0 ));
26
+
27
+ return memo[n-1 ];
28
+ }
29
+ };
30
+
31
+ int main () {
32
+
33
+ int nums[] = {2 , 1 };
34
+ vector<int > vec (nums, nums + sizeof (nums)/sizeof (int ));
35
+
36
+ cout << Solution ().rob (vec) << endl;
37
+
38
+ return 0 ;
39
+ }
You can’t perform that action at this time.
0 commit comments