300. Longest Increasing Subsequence(good!)

来源:互联网 发布:gps数据用途 编辑:程序博客网 时间:2024/05/20 01:37

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?


方法一:

O(n^2)很容易

class Solution {public:int lengthOfLIS(vector<int>& nums) {if (nums.size() == 0) return 0;vector<int> lis(nums.size(), 1);int gmax = 1;for (int i = 1; i < nums.size(); i++){for (int j = 0; j < i; j++){if (nums[i]>nums[j]){lis[i] = max(lis[i], lis[j] + 1);}}if (lis[i]>gmax){gmax = lis[i];}}return gmax;}};

方法二:

O(nlgn)

举个例子,输入为[1,4,6,2,3,5]
-读到1,将其追加到解集中
-读到4,将其追加到解集中,解集变为[1,4];
-读到6,将其追加到解集中,解集变为[1,4,6];
-读到2,用其替换解集中的4,解集变为[1,2,6];
-读到3,用其替换解集中的6,解集变为[1,2,3];
-读到5,将其追加到解集中,解集变为[1,2,3,5],得到答案为解集长度4。

class Solution {public:int lengthOfLIS(vector<int>& nums) {vector<int> res;for (int i = 0; i < nums.size(); i++){auto iter = lower_bound(res.begin(), res.end(), nums[i]);if (iter == res.end()) res.push_back(nums[i]);else*iter = nums[i];}return res.size();}};



0 0
原创粉丝点击