首页 > 其他 > 详细

[300] Longest Increasing Subsequence

时间:2020-04-24 09:07:56      阅读:55      评论:0      收藏:0      [点我收藏+]

要求

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

思路

  • 暴力解法:选择所有子序列进行判断((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

[300] Longest Increasing Subsequence

原文:https://www.cnblogs.com/cxc1357/p/12765197.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!