300. Longest Increasing Subsequence

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

Input: [10,9,2,5,3,7,101,18]
Output: 4 
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. 

Note:

  • 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?

最长递增子序列

C++(4ms):二分

 1 class Solution {
 2 public:
 3     int lengthOfLIS(vector<int>& nums) {
 4         vector<int> tails(nums.size() , 0) ;
 5         int len = 0 ;
 6         for(int num : nums){
 7             int index = binarySearch(tails,len,num) ;
 8             tails[index] = num ;
 9             if (index == len){
10                 len++ ;
11             }
12         }
13         return len ;
14     }
15     
16     int binarySearch(vector<int> tails , int len , int num){
17         int left = 0 ;
18         int right = len ;
19         while(left < right){
20             int mid = left + (right - left) / 2 ;
21             if (tails[mid] == num){
22                 return mid ;
23             }else if(tails[mid] < num){
24                 left = mid + 1 ;
25             }else{
26                 right = mid ;
27             }
28         }
29         return left ;
30     }
31 };

C++(20ms):dp

 1 class Solution {
 2 public:
 3     int lengthOfLIS(vector<int>& nums) {
 4         vector<int> dp(nums.size() , 0) ;
 5         int res = 0 ;
 6         for(int i = 0 ; i < nums.size() ; i++){
 7             int dpMax = 0 ;
 8             for(int j = 0 ; j < i ; j++){
 9                 if (nums[i] > nums[j]){
10                     dpMax = max(dpMax , dp[j]) ;
11                 }
12             }
13             dp[i] = dpMax + 1 ;
14             res = max(res,dp[i]) ;
15         }
16         
17         return res ;
18     }
19 };
原文地址:https://www.cnblogs.com/mengchunchen/p/10270744.html