[300] Longest Increasing Subsequence

要求

  • 给定一个整数序列,求其中的最长上升子序列长度
    • 子序列元素可不相邻
    • 元素相等不算上升
    • 一个序列可能有多个最长上升子序列,但最长的长度只有一个

思路

  • 暴力解法:选择所有子序列进行判断((2^n)*n)
  • 动态规划(n^2)
    • LIS(i):[0...i]范围内,选择数字nums[i]可以获得的最长上升子序列长度
    • LIS(i) = max( 1 + LIS(j) if nums[i] > nums[j] ) (j<i)

实现

 1 class Solution {
 2 public:
 3     int lengthOfLIS(vector<int>& nums) {
 4     
 5         if( nums.size() == 0 )
 6             return 0;
 7         
 8         // memo[i] 表示以 nums[i] 为结尾的最长上升子序列的长度 
 9         vector<int> memo(nums.size(),1);
10         for( int i = 1 ; i < nums.size() ; i ++ )
11             for( int j = 0 ; j < i ; j ++ )
12                 if( nums[j] < nums[i] )
13                     memo[i] = max( memo[i] , 1 + memo[j] );
14         
15         int res = 1;
16         for( int i = 0 ; i < nums.size() ; i ++ )
17             res = max( res, memo[i] );
18         
19         return res;            
20     }
21 };
View Code

相关

  • 376 Wiggle Subsequence

猜你喜欢

转载自www.cnblogs.com/cxc1357/p/12765197.html