「LeetCode」300-最长递增子序列⚡️

91 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲
欢迎小伙伴们加我微信sudongyuer拉你进群
关注我的公众号:前端速冻鱼一起进步,期待与大家共同成长🥂

前言🌧️

算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。

因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。

编写指令的好坏,会直接影响到程序的性能优劣,而指令又由数据结构和算法组成,所以数据结构和算法的设计基本上决定了最终程序的好坏

题目🦀

300. 最长递增子序列

难度中等

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

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

示例 1:

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

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500

  • -104 <= nums[i] <= 104

进阶:

  • 你能将算法的时间复杂度降低到 O(n log(n)) 吗?

解题思路🌵

  • 一般求极值问题,我们可以采取动态规划来求解
  • 确定边界条件
  • 确定dp初始值
  • 确定dp下标的意义是什么(本题dp[i] 表示第i个位置的最长递增子序列的长度为多少)
  • 确定循环顺序
  • 确定递推公式
  • 返回结果

解题步骤🐂

  • 对边界情况处理
  • 初始化dp数组,每个位置默认的最长递增子序列就是它自己1
  • 开始循环,外循环取dp[i]每个位置
  • 内循环遍历当前i前面的所有数j,如果dp[i]>nums[j]则更新 dp[i]=Math.max(dp[i],dp[j]+1)
  • 最后返回所有位置中的最大值Math.max(...dp)

源码🔥

/**
 * @param {number[]} nums
 * @return {number}
 */
var lengthOfLIS = function(nums) {
    if(!nums.length){
        return 0
    }
    const dp = Array(nums.length).fill(1)

    for(let i=0;i<nums.length;i++){
        for(let j=0;j<i;j++){
            if(nums[i]>nums[j]){
                dp[i]=Math.max(dp[i],dp[j]+1)
            }
        }
    }

    return Math.max(...dp)
};

时间复杂度:O(n^2)

空间复杂度:O(n)

结束语🌞

那么鱼鱼的LeetCode算法篇的「LeetCode」300-最长递增子序列⚡️ 就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

github🤖:sudongyu

个人博客👨‍💻:速冻鱼blog

vx👦:sudongyuer

写在最后

伙伴们,如果喜欢我的口水话给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。