一、题意
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
二、解法
解法:
贪心+二分查找
d
p
[
i
]
dp[i]
dp[i]代表长度为i的最长上升子序列的末尾元素的最小值,
nums[j]>dp[i]:
d
p
[
+
+
i
]
=
n
u
m
s
[
j
]
dp[++i]=nums[j]
dp[++i]=nums[j]
else:找到i,使得
d
p
[
i
−
1
]
<
n
u
m
s
[
j
]
<
d
p
[
i
]
dp[i-1]<nums[j]<dp[i]
dp[i−1]<nums[j]<dp[i],即找到第一个比j大的值得位置.dp[i]=nums[j];
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
)
O(n)
O(n)
三、代码
解法:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if(n==0){
return 0;
}
vector<int> dp(n+1);
int len=1;
dp[1] = nums[0];
for(int i=1;i<n;i++){
if(nums[i]>dp[len]){
dp[++len] = nums[i];
}
else{
int left = 1;
int right = len;
int p=1;
while(left<=right){
int mid = (left+right)/2;
if(nums[i]>dp[mid]){
p=mid+1;
left = mid+1;
}
else{
right = mid-1;
}
}
dp[p]=nums[i];
}
}
return len;
}
四、总结
五、引用
[1] leetcode:300. Longest Increasing Subsequence
[2] leetcode:300. Longest Increasing Subsequence官方解法