最长递增子序列(dp,贪心,最大增长子序列技巧,leetcode300)-------------------c++实现

本文介绍了如何使用动态规划和贪心算法解决LeetCode上的300题——最长递增子序列问题。给出了两种C++实现,一种是基于暴力搜索的动态规划方法,另一种是利用巧妙替换的贪心策略。动态规划方案通过遍历数组并维护一个长度数组来找到最长递增子序列;贪心策略则通过维护一个递增序列,并在遇到新元素时进行替换操作,达到优化效果。

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

最长递增子序列(dp动态规划,贪心,最大增长子序列技巧,leetcode300)-------------------c++实现

题目表述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

样例

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

条件

1 <= nums.length <= 2500
-104 <= nums[i] <= 104

思路

1.dp暴力思想,申请一个int数组位数和原数组一一对应,每一位都遍历之前位数的值以及最长子序列个数,对比得出最大值保存在此位。
2.贪心,保存最长递增序列子串x,每一位依次判断,如果该位比x的最后一位大,则直接保存,否则,把该值替换掉x里大于该值的最小值。

注意点

注意边界值

ac代码

c++:

dp暴力算法

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
          vector<int> remember = vector<int>(nums.size());
          if(nums.size()<=1)
          return nums.size();
          else
          remember[0]=1;
          for(int i = 1;i<nums.size();i++)     //remember[i]==1则表示0-(i-1)的字符串可以被表示
          {       int max = 0;
              for(int j=0;j<i;j++)
              if(nums[j]<nums[i]&&remember[j]>=max)
              max=remember[j];
          remember[i]=max+1;
          }
          int result=0;
          for(auto i:remember)
          if(i>result)result=i;
          return result;
    }
};

贪心巧妙替换算法

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
            vector<int> data;
             data.push_back(nums[0]);
             if(!nums.size())
             return 0;
             int max = 1;
            for(int i=1;i<nums.size();i++)
            {
                if(nums[i]>data[max-1])
                {max++;data.push_back(nums[i]);}
                 else
                 {
                     int front = 0,rear = max-1;
                     int middle;
                     while(front<=rear)
                     {
                         middle=(front+rear)>>1;
                          if(data[middle]==nums[i])
                          break;
                          if(data[middle]>nums[i])
                          rear=middle-1;
                          else
                          front=middle+1;
                     }
                     if(data[middle]!=nums[i])
                           data[front]=nums[i];
                 }
            }
            return max;

    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值