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.
Subscribe to see which companies asked this question.
这题题意是,给一个数组v,选择数组中的最长递增子序列。子序列中数字不需要在数组中相邻,只要子序列中前一个数字下标小于下一个数字即可。
由于要求最长子序列,是一个求解最优的问题,我们可以考虑动态规划。
对于其中任何一个数字,我们可以计算如果以它作为子序列的结尾,那么该子序列最长是多长
令 f(n)为以下标为n的数字为结尾时,该子序列最长为多长。将f数组初始化为全1,因为任何一个位置子序列最短为1,即只含该数字本身。
显然,f (n) = max(f(n), f(i)+1) 其中 0<= i < n且 v[i] < v[n] (否则不能递增)
最后,从f中选择最大值作为结果
代码如下:
int lengthOfLIS(vector<int>& nums) {
if (nums.empty()) return 0;
vector<int> f(nums.size()+1, 1); //将数组初始化为全1
for (int k = 1; k < nums.size(); k++)
for (int i = k-1; i >= 0; i--)
if (nums[i] < nums[k])
f[k] = max(f[k], f[i]+1);
int Max = 0;
for (int i = 0; i < nums.size(); i++) //选择f中最大值
Max = max(Max, f[i]);
return Max;
}