问题描述
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?
解决思路
构建一个状态数组dp[i],表示的是长度为i的递增数组的最后一个值。对于一个新的元素,我们在dp数组中找到第一个比它大的元素,然后将这个dp数组元素的值进行更新(变成新元素),因为dp是一个递增的数组,所以可以使用二分查找,由此得到一个复杂度为O(nlogn)的算法。代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0)
return 0;
vector<int> res;
res.push_back(INT_MIN);
for(int i = 0; i < nums.size(); ++i) {
int pos = binary_find(res,nums[i]);
if (pos == res.size())
res.push_back(nums[i]);
else
res[pos] = nums[i];
}
return res.size()-1;
}
int binary_find(vector<int>& vec, int target) {
int end = vec.size()-1;
int begin = 0;
while(begin <= end) {
int mid = (begin+end)/2;
if (vec[mid] == target)
return mid;
else if (vec[mid] < target)
begin = mid+1;
else
end = mid-1;
}
if (begin > vec.size()-1)
return begin;
if (vec[begin] < target)
return begin+1;
else
return begin;
}
};