标签:时间 turn 子序列 max red 挑战 动态规划 开始 art
原题网址: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)
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;
}
};
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;
}
标签:时间 turn 子序列 max red 挑战 动态规划 开始 art
原文地址:https://www.cnblogs.com/Tang-tangt/p/9284851.html