给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入:[10,9,2,5,3,7,101,18]
输出: 4 解释: 最长的上升子序列是[2,3,7,101],
它的长度是4
。
说明:
题目分析:
方法一:动态规划,用dp[i]表示以nums[i]结尾的最长上升子序列。那么如何求dp[i]呢,只要看nums[i]之前的元素,哪个元素比nums[i]要小,并且它的dp[]值最大,那么dp[i]就在它dp值的基础上加1即可。最后求所有dp数组的最大值。
代码展示:
class Solution {
public:
int lengthOfLIS(vector& nums) {
vector dp(nums.size(),1);
if(nums.size()==0)
return 0;
int ans = 1;
for(int i=1;i
方法二:首先将第一个元素存入vec数组,然后依次看后面的元素。若后面的元素大于vec数组的最后一个元素,则将其加入到vec末尾,否则将它替换掉vec数组中第一个大于等于它的元素。最后返回vec的大小即可。
例如说,原数组:[10,9,2,5,3,7,101,18]
1. 将10加入到vec数组中,vec[] = [10]
2.9<10, 用9替换掉数组中大于等于9的元素,vec[] = [9]
3. vec[] = [2]
4.vec[] = [2,5]
5.vec[] = [2,3]
6.vec[] = [2,3,7]
7.vec[] = [2,3,7,101]
8.vec[] = [2,3,7,18]
返回vec的数组个数4
代码展示:
class Solution {
public:
int lengthOfLIS(vector& nums) {
vector vec;
if(nums.size()==0)
return 0;
vec.push_back(nums[0]);
for(int i=1;ivec.back())
vec.push_back(nums[i]);
else{
for(int j=0;j=nums[i]){
vec[j] = nums[i];
break;
}
}
//*lower_bound(vec.begin(),vec.end(),nums[i]) = nums[i];
}
}
return vec.size();
}
};
说明:代码12-17行可以用第18行代码代替,作用是相同的。函数lower_bound(first,second,val)在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。