标签:for 规则 查找 子序列 oid turn col cto 一个
给出一个无序的整形数组,找到最长上升子序列的长度。
例如,
给出 [10, 9, 2, 5, 3, 7, 101, 18]
,
最长的上升子序列是 [2, 3, 7, 101]
,因此它的长度是4
。因为可能会有超过一种的最长上升子序列的组合,因此你只需要输出对应的长度即可。
用动态规划思想,考虑用一个数组dp记录到当前数字为止,可能的最长上升子序列长度,注意并不一定是当前子序列的解。这样最后返回dp数组的长度即可。具体以上述数组为例:
通过以上顺序,可以总结出dp数组变化规则:
其中查找dp数组中第一个大于当前数字的数时,可用二分查找降低时间复杂度,这样此解法的总时间复杂度为Ο(nlogn)
1 class Solution { 2 public: 3 int lengthOfLIS(vector<int>& nums) { 4 int l=nums.size(); 5 vector<int> dp; 6 if(l==0) 7 return 0; 8 dp.push_back(nums[0]); 9 for(int i=1;i<l;i++){ 10 biReplace(dp,nums[i]); 11 } 12 return dp.size(); 13 } 14 void biReplace(vector<int>& dp, int x){ 15 int f=0,l=dp.size()-1; 16 if(x>dp[l]){ 17 dp.push_back(x); 18 return; 19 } 20 int m=(f+l)/2; 21 while(dp[m]!=x){ 22 if(dp[m]>x) 23 l=m-1; 24 else f=m+1; 25 if(f>l){ 26 m=f; 27 break; 28 } 29 m=(f+l)/2; 30 } 31 dp[m]=x; 32 } 33 };
LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
标签:for 规则 查找 子序列 oid turn col cto 一个
原文地址:https://www.cnblogs.com/wmx24/p/9005718.html