给定一个整数序列,找到最长上升子序列(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
题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-subsequence/
建立一个栈,为了方便计算大小我并没有使用栈,而是用的vector(数组),但是是栈的思想。每次取栈顶元素和给定数组的第i个元素做比较,如果栈顶元素小于nums[i],则将nums[i]入栈,否则在栈中使用二分法找到第一个大于nums[i]的元素,并且用nums[i]替换它(栈中的元素是递增的),最长序列的长度为count。
举例:原序列为2,5,9,3,6,8
栈为2,5,9,此时读到3,用3替换5,得到2,3,9; 再读6,用6替换9,得到2,3,6;再读8,得到最终栈为2,3,6,8。最长递增子序列为长度4。
class Solution {
public:
/**
* @param nums: The integer array
* @return: The length of LIS (longest increasing subsequence)
*/
int longestIncreasingSubsequence(vector<int> nums) {
// write your code here
vector<int> hel(nums.size() + 1,INT_MIN);
int count = 0;
for (int i = 0;i < nums.size();i++) {
if (nums[i] > hel[count]) hel[++count] = nums[i];
else{
int j = 0,k = count;
while (j < k) {
int mid = (j + k) / 2;
if (hel[mid] > nums[i]) k = mid;
else j = mid + 1;
}
hel[j] = nums[i];
}
}
return count;
}
};