首页 > 其他分享 >力扣300.最长递增子序列(动态规划)

力扣300.最长递增子序列(动态规划)

时间:2024-12-08 21:33:24浏览次数:4  
标签:nums 300 递增 元素 力扣 int 序列 长度 dp

注:本文只是为了记录作者在刷题过程中的一下思路和心得。

思路:每次考虑以第 i 个元素结尾时能够构成的最长子序列。

例如:nums = [0,1,3,2] , 我们从下标为0的元素开始考虑,如果以下标为0的元素结尾,那么这个子序列的长度就为1;然后依次我们考虑后面的元素。当我们考虑到第 i 个元素时,需要依次去检查前面0~i-1的元素中,值比nums[i]小但长度最大的那个,然后取最大值。(具体看代码注释!!)

代码如下:

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();  //获取nums数组长度
        vector<int> dp(n,1);  //建立dp数组
        for(int i=1;i<n;i++){   //从头到尾开始考虑
            for(int j=0;j<i;j++){    //当考虑到第i个元素时,去检查前面i-1个元素
                if(nums[j]<nums[i]){    //以当前结尾的子序列的最大值
                    dp[i]=max(dp[i],dp[j]+1);
                }
            }
        }
        int ans=dp[0];           //记录最长子序列的值
        for(int i=1;i<n;i++){    //查找dp数组中的最大值
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

上面的dp数组的含义是:以第 i 个元素结尾的最长子序列长度,他依靠前面的元素,取前面的nums 元素比nums[i] 小但长度最长的子序列加一。

标签:nums,300,递增,元素,力扣,int,序列,长度,dp
From: https://blog.csdn.net/m0_72174153/article/details/144247197

相关文章

  • 力扣718.最长重复子数组
    思路:用动态规划的思路,即建立dp[n][m],其中n表示nums1的长度,m表示表示nums2的长度,首先明确:d[i][j]的意义,他表示以nums1[i]元素结尾的字符串和以nums2[j]元素结尾的字符串他们的重复子数组的最大长度。其次:当nums1[i]==nums2[j]时,dp[i][i]=dp[i-1][j-1]+1;dp初始化,首先我们只......
  • 力扣2.两数相加
    链表两数相加的问题与数组里面大数相加的问题一样。思路:我们从头开始遍历两个链表,当两个链表都没有到头时,我们正常将该节点的值进行相加,并且建立新的节点来保存当前位的值,加入到前面结果的结尾,同时保存进位的值;若当前任意一个链表没有到达末尾,我们应该继续运算,在运算时把已经......
  • 每日力扣打卡143.重排链表
    题目:给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例1:输入:head=[1,2,3,4]输出:[1,4,2,3]示......
  • 网易小蜜蜂无限关注曝光打粉机,轻松日引流3000+
    项目介绍:网易小蜜蜂网易版的小红书,无限关注曝光打粉机,官方日涨3000粉打底,目前无任何限制,转换到私域概率按最低百分之一都有30人,不封号不限制功能,个人主页直接上微信号设备需求:安卓手机或者电脑模拟器......
  • 力扣打卡8:最长上升子序列
    链接:300.最长递增子序列-力扣(LeetCode)本题我开始想到的是dp,复杂度为O(n^2),这也是很经典的解法。看到进阶解法可以O(nlogn),想到可能是要用到二分,但是,我想到的是和map排序,再二分查找第一个比当前值小的数,再找比它小的所有数,中维护max序列,再塞到map中,可惜严格来讲还是O(n^2)......
  • 【特殊子序列 DP】【hard】力扣446. 等差数列划分 II - 子序列
    给你一个整数数组nums,返回nums中所有等差子序列的数目。如果一个序列中至少有三个元素,并且任意两个相邻元素之差相同,则称该序列为等差序列。例如,[1,3,5,7,9]、[7,7,7,7]和[3,-1,-5,-9]都是等差序列。再例如,[1,1,2,5,7]不是等差序列。数组中的......
  • 力扣 630课程表iii
     原题链接题解反悔贪心,或者说是贪心+优先队列。code classSolution{public:staticboolcmp(vector<int>a,vector<int>b){if(a[1]!=b[1])returna[1]<b[1];returna[0]<b[0];}intscheduleCourse(vector<vector<int>......
  • 力扣每日打卡 92.反转链表II
    题目:给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例:输入:head=[1,2,3,4,5],left=2,right=4输出:[1,4,3,2,5]提示:链表中节点数目为n1<=n<=500-500<=Node.......
  • 力扣61题 -- 旋转链表(C++)
    文章目录一、题目要求二、思路分析三、代码展示一、题目要求给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]二、思路分析以......
  • 力扣 179.最大数
    原题链接题解首先,第一感觉是直接按照字符串本身大小排序再相连;但是通过样例二可知此方法错误。因此,我们重新思考,上面的排序方法错误的原因在于上述的排序满足s1<=s2,但是不满足s1+s2<=s2+s1(我们称之为加法的传递原则)。此时我们重新定义排序规则:当s1+s2<=s2+s1时就排序,否则保持......