给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
输入格式:
输入包含两行。第一行给出一个正整数n(1≤n≤2500)。第二行给出n个由空格分隔的整数(-10^4≤nums[i]≤10^4)。
输出格式:
在一行中输出最长递增子序列的长度。
输入样例1:
8
10 9 2 5 3 7 101 18
输出样例1:
4
输入样例2:
6
0 1 0 3 2 3
输出样例2:
4
输入样例3:
7
7 7 7 7 7 7 7
输出样例3:
1
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
思路是从当前位置的数往前看,也就是用当前位置的数和前面的数比较,结果大于的话,递增序列的长度就是上个位置递增序列的长度+1
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n],b[n]; //a[n]用来输入数据 ,b[n]用来记录递增数列的长度
int i;
for(i=0;i<n;i++)
{
cin>>a[i];
b[i]=0; //数组b[n]全部初始化为0;
}
int max=-1;
//最短的的递增数列为1,但是b[i]比序列长小1,最小为0所以只要把max随便定义一个小于0的数即可
for(i=0;i<n;i++) //这里我们要用到双重循环,外循环遍历每一个数
{ //内循环从当前的数依次跟前面一个数进行大小比较
for(int j=i-1;j>=0;j--) //判断条件除了要满足当前的数大于上一个数,还得满足当前的序列长度要小于上一个
{ //位置的序列长度+1, 加一是因为该序列最长为b[j]+1,这样做是为了防止重复加导致
if(a[i]>a[j]&&b[i]<=b[j]+1) //构不成递增,比如数据"2,5,3,7"在a[i]为7的时候,会有7>3,7>5,7>2,这样的话此时
{ //序列长度就为4了,但实际上3不大于5,所以只满足两个序列7>3>2和7>5>2,序列长度是3
b[i]=b[j]+1; //b[j]储存的是序列长度,如果当前的数大于上一个数,在上一个位置的序列长基础上
} //加一,就是当前位置的序列长度
if(b[i]>max)
{
max=b[i];
}
}
}
cout<<max+1;//这里的加一是因为要包括当前节点,上面b[i]少了当前位置的数,实际b[i]是序列长-1
return 0;
}