76 最长上升子序列 Lintcode--010(最长上升子序列) lintcode:最长上升子序列

原题网址:https://www.lintcode.com/problem/longest-increasing-subsequence/description

描述

给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。

您在真实的面试中是否遇到过这个题?  

说明

最长上升子序列的定义:

最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
https://en.wikipedia.org/wiki/Longest_increasing_subsequence

样例

给出 [5,4,1,2,3],LIS 是 [1,2,3],返回 3
给出 [4,2,4,5,3,7],LIS 是 [2,4,5,7],返回 4

挑战

要求时间复杂度为O(n^2) 或者 O(nlogn)

标签
二分法
LintCode 版权所有
动态规划(DP)
 
 
O(n^2)思路
动态规划,dp【i】为以 i 为终点的子数组的最长上升子序列长度。
状态转移方程:对每个i,遍历其之前的动态规划数组,即dp【j】(0<=j<i),如果nums【i】>nums【j】(保证子数组终点),dp【j】加1。然后,找到最大的dp【j】赋给dp【i】。
最后返回dp数组最大值。
 
AC代码:
class Solution {
public:
    /**
     * @param nums: An integer array
     * @return: The length of LIS (longest increasing subsequence)
     */
    int longestIncreasingSubsequence(vector<int> &nums) {
        // write your code here
    int size=nums.size();
    if (size<=0)
    {
        return 0;
    }
    vector<int> dp(size,1);
    int maxl=0;
    for (int i=1;i<size;i++)
    {
        for (int j=0;j<i;j++)
        {
            if (nums[i]>nums[j])
            {
                dp[i]=max(dp[i],dp[j]+1);//更新dp[j],将选出最大dp[j]赋给dp[i];
            }
        }
        maxl=max(maxl,dp[i]);//更新dp数组最大元素;
    }
    return maxl;
    
    }
};

参考:

Lintcode--010(最长上升子序列)  讲解详细

lintcode-最长上升子序列-76   O(n ^ 2)代码更简洁

lintcode:最长上升子序列  讲解详细

 
O(nlogn)思路
 
 
 
 
 
 
 
 
 
 
 
—————————————————分割线,错误代码记录————————————————
 
最开始的想法是遍历数组,将当前元素nums【i】作为子序列起始值。然后遍历 i 之后的元素,如果比起始值大,长度就+1,同时用该元素更新起始值,进入下一次对比。最后返回子序列长度最大的。
这个思路是错的,因为无法保证每次求得的长度是当前位置(i)上最长子序列。
如【10,11,1,12,2,11,3,10,4】,返回结果是3,而实际结果是4。
 
代码:
int longestIncreasingSubsequence1(vector<int> &nums)
{
    int size=nums.size();
    if (size<=0)
    {
        return 0;
    }
    int pre;
    int len=1,result=1;
    for (int i=0;i<size;i++)
    {
        pre=nums[i];
        len=1;
        for (int j=i+1;j<size;j++)
        {
            if (nums[j]>pre)
            {
                pre=nums[j];
                len++;
            }
        }
        if (len>result)
        {
            result=len;
        }
    
    }

    return result;
}
 
 

猜你喜欢

转载自www.cnblogs.com/Tang-tangt/p/9284851.html