最长上升子序列
最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
思路:
代码:
void lenthOfLIS(vector<int> nums){
int n=(int)nums.size();
if (n==0)
return ;
vector<int>dp(n,0);
for (int i = 0; i < n; i++)
{
dp[i]=1;
for (int j = 0; j < i; j++)
{
if (nums[j]<nums[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
vector<int>record;
int t= *max_element(dp.begin(),dp.end());
cout<<t<<endl;
}
代码1:
int lengthOfLIS(vector<int>& nums) {
int len = 1, n = (int)nums.size();
if (n == 0) return 0;
vector<int> d(n + 1, 0);
d[len] = nums[0];
for (int i = 1; i < n; ++i) {
if (nums[i] > d[len]) d[++len] = nums[i];
else{
int l = 1, r = len, pos = 0; // 如果找不到说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0
while (l <= r) {
int mid = (l + r) >> 1;
if (d[mid] < nums[i]) {
pos = mid;
l = mid + 1;
}
else r = mid - 1;
}
d[pos + 1] = nums[i];
}
}
return len;
}
代码2:
分析:显然这是利用upper_bound()这个函数。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
int *arr= new int[n+1];
for(int i=1;i<=n;i++)cin>>arr[i];
int len1=1;
int d1[10001];
d1[1]=arr[1];
for (int i = 2; i <= n; i++)
{
if (arr[i]>d1[len1]) {
d1[++len1]=arr[i];
}
else
{
int p1 = upper_bound(d1 + 1, d1 + 1 + len1, arr[i]) - d1;
d1[p1] = arr[i];
}
}
cout<<len1<<endl;
}
结果:
因上求缘,果上努力~~~~ 作者:多发Paper哈,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12747603.html