首页 > 编程语言 >代码随想录算法训练营第45天 | 子序列入门

代码随想录算法训练营第45天 | 子序列入门

时间:2024-07-26 11:18:52浏览次数:13  
标签:return nums res 训练营 45 随想录 len 序列 dp

300.最长递增子序列
https://leetcode.cn/problems/longest-increasing-subsequence/
代码随想录
https://programmercarl.com/0300.最长上升子序列.html
674.最长连续递增序列
https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/
代码随想录
https://programmercarl.com/0674.最长连续递增序列.html#算法公开课
718.最长重复子数组
https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/
代码随想录
https://programmercarl.com/0718.最长重复子数组.html#其他语言版本

300.最长递增子序列

题解

  • dp数组定义:dp[i]到以nums[i]为结尾的最长递增子序列的长度;
  • 递推序列:
    • j遍历i之前每一个元素:dp[i] = max(dp[j]+1,dp[i])
  • 初始化:
    • dp = [1]*n
  • 遍历顺序
    • i:从小到大遍历;依赖前面计算过的结果;
    • j:前后都可以;元素完整即可;
点击查看代码
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 1
        if len(nums)==0:
            return 0
        dp = [1]*len(nums)
        res = 0
        for i in range(1,len(nums)):
            for j in range(0,i):
                if nums[j]<nums[i]:
                    dp[i] = max(dp[i],dp[j]+1)
            if dp[i]>res:
                res = dp[i]
        return res

674.最长连续递增序列

题解

  • dp数组定义:变成连续递增的最长递增子序列
  • 递推公式变了:只和i-1有关
    • dp[i] = dp[i-1]+1
点击查看代码
class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 1
        if len(nums)==0:
            return 0
        dp = [1]*len(nums)

        res = 0
        for i in range(1,len(nums)):
            if nums[i]>nums[i-1]:
                dp[i] = dp[i-1]+1
            if dp[i]>res:
                res = dp[i]
            # print(dp)
        return res

718. 最长重复子数组

题解

  • 递推公式:dp[i][j] = dp[i-1][j-1]+1
    • 不需要比较dp[i-1][j]和dp[i][j-1]
点击查看代码
class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        m = len(nums1)
        n = len(nums2)
        ## dp[i][j] 前i个j个元素中相同的元素有几个;
        dp = [[0]*(n+1) for _ in range(m+1)]
        ## 不需要专门遍历某一行 直接从第1行开始就可以
        res = 0
        ## 统一扩大一行
        for i in range(1,m+1):
            for j in range(1,n+1):
                if nums1[i-1]==nums2[j-1]:
                    dp[i][j] = dp[i-1][j-1]+1
                if dp[i][j]>res:
                    res = dp[i][j]
        return res

标签:return,nums,res,训练营,45,随想录,len,序列,dp
From: https://www.cnblogs.com/P201821440041/p/18323499

相关文章

  • 代码随想录算法训练营第44天 | 动态规划9:买卖股票总结
    188.买卖股票的最佳时机IVhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/代码随想录https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课309.最佳买卖股票时机含冷冻期https://leetcode.cn/problems/best-time-to-buy-a......
  • [ABC363G] Dynamic Scheduling 与 P4511 [CTSC2015] 日程管理
    思路:对于插入操作,设插入\(\{t,p\}\):若当前\(1\simt\)有空位,那么就放进去。否则,\(1\simt\)是被塞满了的:首先容易想到的是找到\(1\simt\)中贡献最小的那个工作,若贡献比\(p\)还小,可以与之替换掉。但是假了,考虑这样一种情况:在\(1\simt\)外有一个更小的......
  • 2024牛客暑期多校训练营4
    Preface最赤石的一集,上来先认为D是个煞笔贪心提交了该题的第一发代码并喜提WA后面下机后祁神把L扔给我告诉我就是个煞笔线段树板,结果我写完过不去样例发现题意假了值得一提的是最后发现这两题是这场过的人最少的两题,直接开局给我干的道心破碎之后A题写不来带权并查集样......
  • 第九天|字符串| 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.
    边写边更中Day9花了我好长时间,由于一道题有好几种方法,感觉今天上午下午都在做Day9,心态有点崩,因为今天还没有时间科研。我决定休息一下,先更到这里。气死我了151.翻转字符串里的单词方法1_fff:定义一个新的字符串str,遍历s,从后往前找到每个单词添加到str中classSolu......
  • 代码随想录 day8|| 151 翻转单词 28 字符串匹配 459 重复子串
    151翻转单词funcreverseWords(sstring)string{ //思考:判断单词条件是从0或者空格开始到终或者空格结尾,最简单方式strings.split之后变成切片,然后反转就行了 //考虑双指针,左指针指向单词首位,右指针指向单词末尾 varres[]byte varleft,rightint forright<len......
  • 「代码随想录算法训练营」第二十天 | 回溯算法 part2
    39.组合总和题目链接:https://leetcode.cn/problems/combination-sum/题目难度:中等文章讲解:https://programmercarl.com/0039.组合总和.html视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ题目状态:久违的通过!思路:使用回溯模板,在单层循环时判断当前数组值是否大于......
  • 算法力扣刷题记录 五十九【450.删除二叉搜索树中的节点】
    前言记录五十八【701.二叉搜索树中的插入操作】保证插的新节点在叶子节点的位置,如此实现递归。那么【450.删除二叉搜索树中的节点】删除如何实现?还有简单的方法吗?一、题目阅读给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二......
  • 代码随想录算法训练营第 23 天 |LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetC
    代码随想录算法训练营Day23代码随想录算法训练营第23天|LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串目录代码随想录算法训练营前言LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串一、基础1、回溯可以看成N叉树2、去......
  • 代码随想录算法训练营第 22 天 |LeetCode77. 组合 LeetCode 216.组合总和III LeetCode
    代码随想录算法训练营Day22代码随想录算法训练营第22天|LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合目录代码随想录算法训练营前言LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合一、基础1、回溯可以解......
  • 代码随想录算法训练营第二十二天|回溯算法part01
    第77题.组合在单个集合1-n中,寻找所有个数为k的组合。和所有递归一样,都有三部曲。确定参数与返回值确定终止条件单层逻辑首先,回溯算法的返回值一般是void,参数依照题目要求而增加,在这一题中,参数有n,k还有startIndex。终止条件是path的size等于k,将path存放在result中。......