300.最长上升子序列

博客介绍了最长递增子序列的两种解法。一是动态规划,时间复杂度为O(n^2),通过状态转移方程计算以第i个元素结尾的最长递增序列长度;二是二分+动态规划,借助help数组,遍历元素时根据规则更新数组,最终得到序列长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.动态规划O(n^2)
参考:https://blog.youkuaiyun.com/maotianyi941005/article/details/81330389

int lengthOfLIS(vector<int>& nums) {       
          vector<int> maxlis(nums.size(),1);
          int len = nums.size();
          int lisNum = 1;
          int i,j;
          if(len == 0 || len == 1) return len;
          for(i = 1;i < len; i++) {
              for (j = 0; j < i; j++) 
              {
                     if (nums[i] > nums[j]) maxlis[i] = max(maxlis[j] + 1, maxlis[i]);
              }
              if (maxlis[i] > lisNum) lisNum = maxlis[i];  
         }
        return lisNum; 
    }

状态转移方程:
maxlis[i] = max(maxlis[j] + 1) if (nums[j] < nums[i])

maxlis[i]表示以第i个元素结尾的最长递增序列长度。第i个元素nums[i]可以接到之前所有比他小的元素后面构成一个递增序列。我们从其中找出最长的序列然后接上就是以nums[i]结尾的最大长度了

2.二分+动态规划(没看太明白)
help[i]表示最长子序列长度为i时的最小的结尾num值
参考:
https://blog.youkuaiyun.com/maotianyi941005/article/details/81330389

https://leetcode.com/problems/longest-increasing-subsequence/discuss/74855/Short-C%2B%2B-STL-based-solution%3A-O(n-log-n)-time-O(1)-space-with-explanation

新建一个数组help,依次遍历nums的元素,如果该元素大于help的最后一个元素,则将其加入help并放在最后,如果不是,则从help中找出第一个比他大的元素并用nums的这个元素替换掉它。最后得到的序列长度就是答案,但是help中保存的序列不是对应的最长子序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值