-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlongest-increasing-subsequence.cpp
More file actions
97 lines (84 loc) · 2.62 KB
/
longest-increasing-subsequence.cpp
File metadata and controls
97 lines (84 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class Solution {
public:
// 很不好想,还是先记住吧
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0) return 0;
vector<int> tail(nums.size());
int size=0;
for(const auto &n:nums){
int l=0;
int r=size;
while(l<r){
int mid=l+r>>1;
if(tail[mid]>=n) r=mid; // 找到第一个大于等于n的位置
else l=mid+1;
}
tail[l]=n;
if(l==size) size++;
}
return size;
}
int lengthOfLIS4(vector<int>& nums) {
vector<int> tail(nums.size());
int size=0;
for(const auto &n:nums){
int i=-1,j=size;
while(i+1!=j){
int mid=i+(j-i)/2;
if(n>tail[mid]) i=mid;
else j=mid;
}
tail[j]=n;
if(j==size) size++;
}
return size;
}
//三刷,这个解法自己感觉想不粗来:https://leetcode.com/problems/longest-increasing-subsequence/discuss/74824/JavaPython-Binary-search-O(nlogn)-time-with-explanation
int lengthOfLIS3(vector<int>& nums) {
vector<int> tail(nums.size());
int size=0;
for(const auto& n:nums){
int l=-1,r=size;
while(l+1<r){
int mid=l+(r-l)/2;
if(tail[mid]<n) l=mid;
else r=mid;
}
tail[r]=n;
if(r==size) size++;
}
return size;
}
//自己做的 O(n2)
int lengthOfLIS1(vector<int>& nums) {
if(nums.size()==0) return 0;
int result=0;
vector<int> len(nums.size());
for(int i=0;i<nums.size();i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
len[i]=max(len[j]+1,len[i]);
}
}
result=max(result,len[i]);
}
return result+1;
}
// O(n log n)这个解法过于精妙,我没有理解。
//https://segmentfault.com/a/1190000003819886 和 https://leetcode.com/problems/longest-increasing-subsequence/discuss/74824/JavaPython-Binary-search-O(nlogn)-time-with-explanation
int lengthOfLIS2(vector<int>& nums) {
vector<int> tail(nums.size());
int size=0;
for(auto & n:nums){
int i=0,j=size;
while(i!=j){
int mid=i+(j-i)/2;
if(n>tail[mid]) i=mid+1;
else j=mid;
}
tail[i]=n;
if(i==size) size++;
}
return size;
}
};