Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
Credits:
Special thanks to @pbrother for adding this problem and creating all test cases.
最长上升子序列问题LIS先不思考二分的解法我们先考虑动态规划O(n2)的解法
先看例子【10,9,2,5,3,7,101,18】
【10】dp【0】=1;只有一个10
【10,9】dp【1】=1;9比10小,只有长度为1的LIS
【10,9,2】dp【2】=1;2比9,10小
【10,9,2,5】dp【3】=2;5>2我们先假设dp【i】=1+dp【i-1】是状态转移
【10,9,2,5,3】dp【4】=2;3<5但是dp【4】=2,思考我们这时的2是由于3>2导致的不如假设dp【i】=max(所有的小于i的j值)(dp【j】+1)
【10,9,2,5,3,7】dp【5】=3;用上一个状态转移ok
【10,9,2,5,3,7,101】dp【6】=4;用上一个状态转移ok
【10,9,2,5,3,7,101,18】dp【7】=4;用上一个状态转移ok
写代码试下
int max(int a,int b)
{
return a>b?a:b;
}
int lengthOfLIS(int* nums, int numsSize) {
if(numsSize<=1)
{
return numsSize;
}
int dp[numsSize];
for(int i=0;i<numsSize;i++)
{
dp[i]=1;
}
dp[0]=1;
int ans=dp[0];
for(int i=1;i<numsSize;i++)
{
for(int j=0;j<i;j++)
{
if(nums[i]>nums[j])
{
dp[i]=max(dp[i],dp[j]+1);
ans=max(ans,dp[i]);
}
}
}
return ans;
}