• 刷题日记1


    最近在用JavaScript刷动态规划的题组,刷了一半感觉只刷题不写笔记的话印象没那么深刻,所以从今天开始来记录一下刷题情况。

    力扣T300 300. 最长递增子序列

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

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

    这道题的思路是:

    判断以第i个元素为结尾的最长子序列的长度

    dp【i】的含义是以第i个元素为结尾的最长子序列的长度

    在动态规划过程中,我们依次遍历每个元素,在遍历当前元素时,让该元素与之之前的每个元素大小作比较,如果nums【i】元素大于nums【j】元素,说明nums【i】可以在已经以nums【j】为结尾的最长子序列基础上接上去构成+1大小的最长子序列。并且在内循环遍历过程中要不断和自身dp【i】做比较看是否需要更新最长子序列长度。

    遍历完一个元素的情况之后要更新当前获取的最长子序列长度

    1. /**
    2. * @param {number[]} nums
    3. * @return {number}
    4. */
    5. var lengthOfLIS = function(nums) {
    6. let n=nums.length
    7. let res=0
    8. let dp=new Array(n).fill(1)
    9. for(let i=0;i
    10. for(let j=0;j
    11. if(nums[j]Math.max(dp[i],dp[j]+1)
    12. }
    13. res=Math.max(res,dp[i])
    14. }
    15. return res//更新当前获取的最长子序列长度
    16. };

    在此题的基础上,变化一下要求,要求获得的不是最长递增子序列的长度,而是该长度的子序列的个数,就变成了下面这道题:

    力扣T673 l673. 最长递增子序列的个数

    给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

    注意 这个数列必须是 严格 递增的。

    在上一题的基础上,这题需要增加一个记录以每个元素为结尾的最长子序列的个数数组cnt

    在每轮遍历更新最大值时,要随后更新对应的个数。

    注意初始化数组dp和cnt时需要赋初值为1

    因为对于每个元素本身,dp【i】和cnt【i】最少为1

    相对上一道题,这里需要考虑更新最大值时,dp【i】=dp【j】+1的情况

    如果dp【i】

    但 如果等于时,相当于不影响最长值但有同样长度效果的另一种情况,所以要加上这种情况的个数

    在每次遍历完当前元素更新最大值时,也需要进行这样的判断才不会漏掉情况。

    1. /**
    2. * @param {number[]} nums
    3. * @return {number}
    4. */
    5. var findNumberOfLIS = function(nums) {
    6. let n=nums.length//数组长度
    7. let res=0//最大长度
    8. let ans=0//最终结果
    9. let cnt=new Array(n).fill(1)//记录以第【i】个元素结尾的最长递增子序列数
    10. let dp=new Array(n).fill(1)//记录以第【i】个元素结尾的最长递增子序列长度
    11. for(let i=0;i
    12. for(let j=0;j
    13. if(nums[j]//如果可以追加到nums[j]后,才有后面的情况可言
    14. {
    15. if(dp[j]+1>dp[i])//获得了更长的情况,最长值变化,最长值序列数量也变化了,变成了cnt【j】的数量
    16. {
    17. dp[i]=dp[j]+1;
    18. cnt[i]=cnt[j]
    19. }else if(dp[j]+1===dp[i])//如果加不加在nums【j】后和最长长度一样,那要把这个长度的情况条数也加上
    20. {
    21. cnt[i]+=cnt[j];
    22. }
    23. }
    24. }
    25. if(dp[i]>res)//更新了最长值,最终结果也要以新的最长值为准
    26. {
    27. res=dp[i];
    28. ans=cnt[i];
    29. }else if(dp[i]===res)//也等于最长值,要加上这种情况的个数
    30. {
    31. ans+=cnt[i]
    32. }
    33. }
    34. return ans;
    35. };

  • 相关阅读:
    xsschallenge通关攻略详解
    还在用typeof、instanceof?是时候给你的类型检查升个级了
    帮公司面试了一个33岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...
    markdown语法整理
    (附源码)springboot《升学日》日本大学信息及院校推荐网站 毕业设计 251949
    Java学习笔记(二十三)
    AO天鹰优化算法|含源码(元启发式算法)
    图神经网络时间序列预测,神经网络预测未来数据
    WPF工控机textbox获得焦点自动打开软键盘
    java面试题及答案2020 大汇总
  • 原文地址:https://blog.csdn.net/m0_62742402/article/details/133914784