O(n2)
int lengthOfLIS(vector<int>& nums) { if(nums.empty())return 0; int len = nums.size(); vector<int> dp(len, 0); for(int i = 0;i < len;++i){ int _max = 1; for(int j = 0;j < i;++j){ if(nums[i] > nums[j]) _max = max(dp[j] + 1, _max); } dp[i] = _max; } int maxlen = 0; for(int n : dp){ maxlen = max(maxlen, n); } return maxlen; }
二分查找 O(nlogn)
int lengthOfLIS(vector<int>& nums) { if(nums.empty())return 0; vector<int> tails(nums.size(), 0); int len = 0; for(int num : nums){ int index = binarySearch(num, len, tails); tails[index] = num; if(index == len)++len; } return len; } int binarySearch(int key, int hi, vector<int> &tails){ int lo = 0, mi = 0; while(lo < hi){ mi = ((hi - lo) >> 1) + lo; if(tails[mi] == key)return mi; else if(tails[mi] > key)hi = mi; else lo = mi + 1; } return lo; }
二分查找问题