Skip to content

Commit 3a0da76

Browse files
committed
Chapter 09 section 08 C++ codes updated. Java codes added.
1 parent 930602c commit 3a0da76

File tree

5 files changed

+219
-50
lines changed

5 files changed

+219
-50
lines changed

09-Dynamic-Programming/Course Code (C++)/08-Longest-Increasing-Subsequence/main.cpp

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
#include <vector>
33
using namespace std;
44

5+
/// 300. Longest Increasing Subsequence
6+
/// https://leetcode.com/problems/longest-increasing-subsequence/description/
7+
/// 记忆化搜索
8+
/// 时间复杂度: O(n^2)
9+
/// 空间复杂度: O(n)
510
class Solution {
611

712
private:
@@ -10,26 +15,27 @@ class Solution {
1015
// 以 nums[index] 为结尾的最长上升子序列的长度
1116
int getMaxLength(const vector<int> &nums, int index){
1217

13-
if( memo[index] != -1 )
18+
if(memo[index] != -1)
1419
return memo[index];
1520

1621
int res = 1;
17-
for( int i = 0 ; i <= index-1 ; i ++ )
18-
if( nums[index] > nums[i] )
19-
res = max( res , 1 + getMaxLength(nums,i) );
22+
for(int i = 0 ; i <= index-1 ; i ++)
23+
if(nums[index] > nums[i])
24+
res = max(res, 1 + getMaxLength(nums, i));
2025

2126
memo[index] = res;
2227
return res;
2328
}
29+
2430
public:
2531
int lengthOfLIS(vector<int>& nums) {
2632

27-
if( nums.size() == 0 )
33+
if(nums.size() == 0)
2834
return 0;
2935

30-
memo = vector<int>( nums.size() , -1 );
36+
memo = vector<int>(nums.size(), -1);
3137
int res = 1;
32-
for( int i = 0 ; i < nums.size() ; i ++ )
38+
for(int i = 0 ; i < nums.size() ; i ++)
3339
res = max(res, getMaxLength(nums, i));
3440

3541
return res;
@@ -38,28 +44,31 @@ class Solution {
3844

3945
int main() {
4046

41-
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18}; // 4
47+
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18};
4248
vector<int> vec1(nums1, nums1 + sizeof(nums1)/sizeof(int));
49+
cout << Solution().lengthOfLIS(vec1) << endl;
50+
// 4
4351

44-
cout<<Solution().lengthOfLIS( vec1 )<<endl;
45-
52+
// ---
4653

47-
int nums2[] = {4, 10, 4, 3, 8, 9}; // 3
54+
int nums2[] = {4, 10, 4, 3, 8, 9};
4855
vector<int> vec2(nums2, nums2 + sizeof(nums2)/sizeof(int));
56+
cout << Solution().lengthOfLIS(vec2) << endl;
57+
// 3
4958

50-
cout<<Solution().lengthOfLIS( vec2 )<<endl;
51-
59+
// ---
5260

53-
int nums3[] = {2, 2}; // 1
61+
int nums3[] = {2, 2};
5462
vector<int> vec3(nums3, nums3 + sizeof(nums3)/sizeof(int));
63+
cout << Solution().lengthOfLIS(vec3) << endl;
64+
// 1
5565

56-
cout<<Solution().lengthOfLIS( vec3 )<<endl;
66+
// ---
5767

58-
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6}; // 6
68+
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6};
5969
vector<int> vec4(nums4, nums4 + sizeof(nums4)/sizeof(int));
60-
61-
cout<<Solution().lengthOfLIS( vec4 )<<endl;
62-
70+
cout << Solution().lengthOfLIS(vec4) << endl;
71+
// 6
6372

6473
return 0;
6574
}

09-Dynamic-Programming/Course Code (C++)/08-Longest-Increasing-Subsequence/main2.cpp

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,90 @@
22
#include <vector>
33
using namespace std;
44

5+
/// 300. Longest Increasing Subsequence
6+
/// https://leetcode.com/problems/longest-increasing-subsequence/description/
7+
/// 动态规划
8+
/// 时间复杂度: O(n^2)
9+
/// 空间复杂度: O(n)
510
class Solution {
611

712
public:
813
int lengthOfLIS(vector<int>& nums) {
914

10-
if( nums.size() == 0 )
15+
if(nums.size() == 0)
1116
return 0;
1217

1318
// memo[i] 表示以 nums[i] 为结尾的最长上升子序列的长度
14-
vector<int >memo( nums.size() , 1 );
15-
for( int i = 1 ; i < nums.size() ; i ++ )
16-
for( int j = 0 ; j < i ; j ++ )
17-
if( nums[i] > nums[j] )
18-
memo[i] = max( memo[i] , 1 + memo[j] );
19+
vector<int> memo(nums.size(), 1);
20+
for(int i = 1 ; i < nums.size() ; i ++)
21+
for(int j = 0 ; j < i ; j ++)
22+
if(nums[i] > nums[j])
23+
memo[i] = max(memo[i], 1 + memo[j]);
1924

2025
int res = memo[0];
21-
for( int i = 1 ; i < nums.size() ; i ++ )
22-
res = max( res , memo[i] );
26+
for(int i = 1 ; i < nums.size() ; i ++)
27+
res = max(res, memo[i]);
2328

2429
return res;
2530
}
2631
};
2732

2833
int main() {
2934

30-
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18}; // 4
35+
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18};
3136
vector<int> vec1(nums1, nums1 + sizeof(nums1)/sizeof(int));
37+
cout << Solution().lengthOfLIS(vec1) << endl;
38+
// 4
3239

33-
cout<<Solution().lengthOfLIS( vec1 )<<endl;
40+
// ---
3441

35-
36-
int nums2[] = {4, 10, 4, 3, 8, 9}; // 3
42+
int nums2[] = {4, 10, 4, 3, 8, 9};
3743
vector<int> vec2(nums2, nums2 + sizeof(nums2)/sizeof(int));
44+
cout << Solution().lengthOfLIS(vec2) << endl;
45+
// 3
3846

39-
cout<<Solution().lengthOfLIS( vec2 )<<endl;
40-
47+
// ---
4148

42-
int nums3[] = {2, 2}; // 1
49+
int nums3[] = {2, 2};
4350
vector<int> vec3(nums3, nums3 + sizeof(nums3)/sizeof(int));
51+
cout << Solution().lengthOfLIS(vec3) << endl;
52+
// 1
4453

45-
cout<<Solution().lengthOfLIS( vec3 )<<endl;
54+
// ---
4655

47-
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6}; // 6
56+
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6};
4857
vector<int> vec4(nums4, nums4 + sizeof(nums4)/sizeof(int));
58+
cout << Solution().lengthOfLIS(vec4) << endl;
59+
// 6
4960

50-
cout<<Solution().lengthOfLIS( vec4 )<<endl;
61+
return 0;
62+
}int main() {
5163

64+
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18};
65+
vector<int> vec1(nums1, nums1 + sizeof(nums1)/sizeof(int));
66+
cout << Solution().lengthOfLIS(vec1) << endl;
67+
// 4
68+
69+
// ---
70+
71+
int nums2[] = {4, 10, 4, 3, 8, 9};
72+
vector<int> vec2(nums2, nums2 + sizeof(nums2)/sizeof(int));
73+
cout << Solution().lengthOfLIS(vec2) << endl;
74+
// 3
75+
76+
// ---
77+
78+
int nums3[] = {2, 2};
79+
vector<int> vec3(nums3, nums3 + sizeof(nums3)/sizeof(int));
80+
cout << Solution().lengthOfLIS(vec3) << endl;
81+
// 1
82+
83+
// ---
84+
85+
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6};
86+
vector<int> vec4(nums4, nums4 + sizeof(nums4)/sizeof(int));
87+
cout << Solution().lengthOfLIS(vec4) << endl;
88+
// 6
5289

5390
return 0;
5491
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import java.util.Arrays;
2+
3+
/// 300. Longest Increasing Subsequence
4+
/// https://leetcode.com/problems/longest-increasing-subsequence/description/
5+
/// 记忆化搜索
6+
/// 时间复杂度: O(n^2)
7+
/// 空间复杂度: O(n)
8+
public class Solution1 {
9+
10+
private int[] memo;
11+
12+
public int lengthOfLIS(int[] nums) {
13+
14+
if(nums.length == 0)
15+
return 0;
16+
17+
memo = new int[nums.length];
18+
Arrays.fill(memo, -1);
19+
int res = 1;
20+
for(int i = 0 ; i < nums.length ; i ++)
21+
res = Math.max(res, getMaxLength(nums, i));
22+
23+
return res;
24+
}
25+
26+
// 以 nums[index] 为结尾的最长上升子序列的长度
27+
private int getMaxLength(int[] nums, int index){
28+
29+
if(memo[index] != -1)
30+
return memo[index];
31+
32+
int res = 1;
33+
for(int i = 0 ; i <= index-1 ; i ++)
34+
if(nums[index] > nums[i])
35+
res = Math.max(res, 1 + getMaxLength(nums, i));
36+
37+
return memo[index] = res;
38+
}
39+
40+
public static void main(String[] args) {
41+
42+
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18};
43+
System.out.println((new Solution1()).lengthOfLIS(nums1));
44+
// 4
45+
46+
// ---
47+
48+
int nums2[] = {4, 10, 4, 3, 8, 9};
49+
System.out.println((new Solution1()).lengthOfLIS(nums2));
50+
// 3
51+
52+
// ---
53+
54+
int nums3[] = {2, 2};
55+
System.out.println((new Solution1()).lengthOfLIS(nums3));
56+
// 1
57+
58+
// ---
59+
60+
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6};
61+
System.out.println((new Solution1()).lengthOfLIS(nums4));
62+
// 6
63+
}
64+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import java.util.Arrays;
2+
3+
/// 300. Longest Increasing Subsequence
4+
/// https://leetcode.com/problems/longest-increasing-subsequence/description/
5+
/// 记忆化搜索
6+
/// 时间复杂度: O(n^2)
7+
/// 空间复杂度: O(n)
8+
public class Solution2 {
9+
10+
public int lengthOfLIS(int[] nums) {
11+
12+
if(nums.length == 0)
13+
return 0;
14+
15+
// memo[i] 表示以 nums[i] 为结尾的最长上升子序列的长度
16+
int memo[] = new int[nums.length];
17+
Arrays.fill(memo, 1);
18+
for(int i = 1 ; i < nums.length ; i ++)
19+
for(int j = 0 ; j < i ; j ++)
20+
if(nums[i] > nums[j])
21+
memo[i] = Math.max(memo[i], 1 + memo[j]);
22+
23+
int res = memo[0];
24+
for(int i = 1 ; i < nums.length ; i ++)
25+
res = Math.max(res, memo[i]);
26+
27+
return res;
28+
}
29+
30+
public static void main(String[] args) {
31+
32+
int nums1[] = {10, 9, 2, 5, 3, 7, 101, 18};
33+
System.out.println((new Solution2()).lengthOfLIS(nums1));
34+
// 4
35+
36+
// ---
37+
38+
int nums2[] = {4, 10, 4, 3, 8, 9};
39+
System.out.println((new Solution2()).lengthOfLIS(nums2));
40+
// 3
41+
42+
// ---
43+
44+
int nums3[] = {2, 2};
45+
System.out.println((new Solution2()).lengthOfLIS(nums3));
46+
// 1
47+
48+
// ---
49+
50+
int nums4[] = {1, 3, 6, 7, 9, 4, 10, 5, 6};
51+
System.out.println((new Solution2()).lengthOfLIS(nums4));
52+
// 6
53+
}
54+
}

0 commit comments

Comments
 (0)