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 is4. 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?
nlgn ---- no idea now how to solve it.
#include <vector>
#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;
// longest increasing sequence.
// dp[i] = max(dp[i], dp[j] + 1) if(a[j] < a[i]), i >= 0 && i <= nums.size(); j >= 0 && j < i;
int lengthOfLIS(vector<int>& nums) {
if(nums.size() <= 1) return nums.size();
vector<int> dp(nums.size() + 1, 1);
for(int i = 1; i <= nums.size(); ++i) {
for(int j = 0; j < i; ++j) {
if(nums[j] < nums[i]) {
dp[i] = max(dp[j] + 1, dp[i]);
}
}
}
int maxLen = INT_MIN;
for(int i = 0; i < nums.size(); ++i) {
maxLen = max(maxLen, dp[i]);
}
return maxLen;
}
int main(void) {
vector<int> nums{10, 9, 2, 5, 3, 7, 101, 18};
int length = lengthOfLIS(nums);
cout << length << endl;
}
To print out the longest increasing sequence.
// print out the increasing sequence
for(int i = n - 1; i >= 0; --i) {
if(dp[i] == tmp) {
cout << nums[i] << endl;
tmp--;
}
}
NLgN method: using binary search
int binarySearch(vector<int>&nums, int left, int right, int target) {
while(right - left > 1) {
int mid = left + (right - left) / 2;
if(nums[mid] >= target) right = mid;
else left = mid;
}
return right;
}
// find the longest increasing subsequence.
int longestIncreasing(vector<int>& nums) {
int n = nums.size();
vector<int> res(n, 0);
int length = 1;
res.push_back(nums[0]);
for(int i = 1; i < nums.size(); ++i) {
if(nums[i] < res[0]) res[0] = nums[i];
else if(nums[i] > res[length - 1]) res[length++] = nums[i];
else {
int index = binarySearch(res, -1, length - 1, nums[i]);
res[index] = nums[i];
}
}
return length;
}

本文探讨了如何在未排序整数数组中找到最长递增子序列的长度,并提供了两种算法实现:一种时间复杂度为O(n^2),另一种通过使用二分查找改进到O(n log n)。同时给出了打印最长递增子序列的方法。

被折叠的 条评论
为什么被折叠?



