首页 > 编程语言 >【JavaScript】LeetCode:96-100

【JavaScript】LeetCode:96-100

时间:2024-11-15 16:19:28浏览次数:3  
标签:target nums max JavaScript let res 100 LeetCode dp

文章目录

96 单词拆分

在这里插入图片描述

  • 动态规划
  • 完全背包:背包-字符串s,物品-wordDict中的单词,可使用多次。
  • 问题转换:s能否被wordDict中的单词组成。
  • dp[i]:长度为i的字符串s[0, i]能否被wordDict组成,dp[i] = true / false。
  • 两层for循环遍历顺序:先背包后物品。
  • i为字符串长度,j从0开始,一直遍历到i - 1,若s[j, i]在wordDict中,且s[0, i - j]能被wordDict组成,则s[0, i]能被wordDict组成。
  • 初始化:dp[0] = true,其他为false。
/**
 * @param {string} s
 * @param {string[]} wordDict
 * @return {boolean}
 */
var wordBreak = function(s, wordDict) {
    let dp = Array(s.length + 1).fill(0);
    dp[0] = 1;
    for(let i = 1; i <= s.length; i++){
        for(let j = 0; j < i; j++){
            if(wordDict.includes(s.slice(j, i)) && dp[j] == 1){
                dp[i] = 1;
            }
        }
    }
    return dp[s.length]? true: false;
};

97 最长递增子序列

在这里插入图片描述

  • 动态规划
  • dp[i]:以nums[i]为结尾的最长递增子序列的长度。
  • 第一层for循环遍历每个数字i,第二层for循环遍历从0到i - 1的每个数字j。
  • 若nums[i] > nums[j],则以nums[i]为结尾的最长递增子序列的长度 = max(以nums[j]为结尾的最长递增子序列的长度 + 1, dp[i])。
  • 初始化:因为每个数字的最长递增子序列的长度最小为1,所以dp[i] = 1。
/**
 * @param {number[]} nums
 * @return {number}
 */
var lengthOfLIS = function(nums) {
    let dp = Array(nums.length).fill(1);
    let res = 1;
    for(let i = 1; 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);
            }
        }
        res = Math.max(res, dp[i]);
    }
    return res;
};

98 乘积最大子数组

在这里插入图片描述

  • 动态规划
  • 由于在数组中有负数,因此这里设置两个dp数组。
  • dp_max[i]:以nums[i]为结尾的子数组的最大乘积,dp_min[i]:以nums[i]为结尾的子数组的最小乘积。
  • dp_max[i] = max(nums[i] * 以nums[i - 1]为结尾的子数组的最大乘积, nums[i] * 以nums[i - 1]为结尾的子数组的最小乘积, nums[i])。
  • dp_min[i] = min(nums[i] * 以nums[i - 1]为结尾的子数组的最大乘积, nums[i] * 以nums[i - 1]为结尾的子数组的最小乘积, nums[i])。
/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function(nums) {
    let dp_max = Array(nums.length).fill(0);
    let dp_min = Array(nums.length).fill(0);
    let res = nums[0];
    dp_max[0] = nums[0], dp_min[0] = nums[0];
    for(let i = 1; i < nums.length; i++){
        dp_max[i] = Math.max(Math.max(nums[i] * dp_max[i - 1], nums[i] * dp_min[i - 1]), nums[i]);
        dp_min[i] = Math.min(Math.min(nums[i] * dp_max[i - 1], nums[i] * dp_min[i - 1]), nums[i]);
        res = Math.max(res, dp_max[i]);
    }
    return res;
};

99 分割等和子集

在这里插入图片描述

  • 动态规划
  • 0 / 1背包
  • dp[j]:容量为j的背包最大价值为dp[j]。
  • target为nums的总和,若使用nums中的物品(数字 = 价值)能把容量为target / 2的背包装满,价值为target / 2,则能够分割等和子集。
  • 根据题意,若target为奇数,则不能够分割等和子集。
  • 第一层for循环遍历物品,第二层for循环遍历背包容量。
  • dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])。
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canPartition = function(nums) {
    let target = nums.reduce((sums, item) => sums + item, 0);
    if(target % 2 == 1){
        return false;
    }else{
        target = Math.floor(target / 2);
    }
    let dp = Array(target + 1).fill(0);
    for(let i = 0; i < nums.length; i++){
        for(let j = target; j >= nums[i]; j--){
            dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
        }
    }
    return dp[target] == target? true: false;
};

100 最长有效括号

在这里插入图片描述

  • 动态规划
  • dp[i]:以s[i]为结尾的最长有效子串的长度。
  • 初始化:dp[i] = 0。
  • (1) 若s[i] = “(”:dp[i] = 0。
  • (2) 若s[i] = “)”:
    ① s[i - 1] = “(”:例如…( ),s[i - 1]和s[i]为有效括号,因此dp[i] = dp[i - 2] + 2。
    ② s[i - 1] = “)”:例如…( (…) ),此时判断s[i - dp[i - 1] - 1]的括号方向,若为"(",则与s[i]为有效括号,因此dp[i] = dp[i - 1] + 2 + 以s[i - dp[i - 1] - 2]为结尾的有效字串的长度。
  •        … )                       (                         (          …     )           )
  • i - dp[i - 1] - 2      i - dp[i - 1] - 1      i - dp[i - 1]   …   i - 1         i
/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function(s) {
    let dp = Array(s.length).fill(0);
    let res = 0;
    for(let i = 1; i < s.length; i++){
        if(s[i] == "("){
            dp[i] = 0;
        }else if(s[i] == ")"){
            if(s[i - 1] == "("){
                if(i - 2 >= 0){
                    dp[i] = dp[i - 2] + 2;
                }else{
                    dp[i] = 2;
                }
            }else if(s[i - 1] == ")" && s[i - dp[i - 1] - 1] == "("){
                if(i - dp[i - 1] - 2 >= 0){
                    dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;              
                }else{
                    dp[i] = dp[i - 1] + 2;
                }
            }
        }
        res = Math.max(res, dp[i]);
    }
    return res;
};

标签:target,nums,max,JavaScript,let,res,100,LeetCode,dp
From: https://blog.csdn.net/weixin_45980065/article/details/143747413

相关文章

  • LeetCode654.最大二叉树
    LeetCode刷题记录文章目录......
  • 【JavaScript】LeetCode:91-95
    文章目录91不同路径92最小路径和93最长回文子串94最长公共子序列95编辑距离91不同路径动态规划dp[i][j]:从[0,0]到[i,j]的路径条数。dp[i][j]=从[0,0]到[i,j]上面一格的路径条数+从[0,0]到[i,j]左边一格的路径条数。初始化:因为第一行的格子只能由左......
  • 2024 年 Java 面试最全攻略:程序员求职跳槽必刷题目 1000+,横扫一切技术盲点!
    写在前面马上又要到收割Offer的季节,你准备好了吗?曾经的我,横扫各个大厂的Offer。还是那句话:进大厂临时抱佛脚是肯定不行的,一定要注重平时的总结和积累,多思考,多积累,多总结,多复盘,将工作经历真正转化为自己的工作经验。面经分享今天给大家分享一个面试大厂的完整面经,小伙......
  • TBM810-ASEMI贴片桥堆8A 1000V
    编辑:llTBM810-ASEMI贴片桥堆8A1000V型号:TBM810品牌:ASEMI封装:TBM-4特性:贴片桥堆正向电流:8A反向耐压:1000V恢复时间:>2000ns引脚数量:4芯片个数:4芯片尺寸:50MIL浪涌电流:50A漏电流:>10uA工作温度:-55℃~150℃包装方式:3k/盘;30k/箱备受欢迎的TBM810整流桥ASEMI品牌TBM810整......
  • 安川Yaskawa机器人DX100示教器维修的方法
        安川Yaskawa机器人DX100示教器维修的优劣势分析安川Yaskawa机器人示教编程,工业机器人维修,即操作人员经过安川机器人示教器,ABB机器人保养,手动操控机器人的关节运动,以使机器人运动到预订的方位,一起将该方位进行记载,并传递到机器人操控器中,今后的机器人可根据指令自......
  • 在 Windows 中,RDP(远程桌面协议)默认使用 3389 端口。如果你想通过 PowerShell 更改此端
    在Windows中,RDP(远程桌面协议)默认使用3389端口。如果你想通过PowerShell更改此端口为10010,你需要修改注册表设置并重启远程桌面服务。以下是使用PowerShell更改RDP端口为10010的步骤:步骤:以管理员身份运行PowerShell。执行以下命令修改注册表,修改RDP端口设置:p......
  • JavaScript介绍与使用
    1.认识jsjs全称(javascript):是网页上面的一个脚本语言运行执行代码逻辑从而达到我们需要的效果2.JavaScript组成核心语法-ECMAScript:规范了JS的基本语法Es是js的语法规范管理者js是Es的实现操作者DOM=>文档对象提供js操作BOM=>浏览器模型对象提供......
  • Python从0到100(七十二):Python OpenCV-OpenCV实现手势音量控制(文末送书)
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • JavaScript常用对象方法二:数组(array)
    1.concat()用于连接两个或多个数组。该方法不会改变现有的数组,而是返回一个新的数组。个人感觉es6出来的扩展运算符比这个方法要简洁一些扩展运算符的方法:constarr1=[1,2];constarr2=[3,4];constarr3=[...arr1,...arr2];console.log(arr3);//[1,2,......
  • leetcode 数组专题 06-扫描线算法(Sweep Line Algorithm)
    扫描线专题leetcode数组专题06-扫描线算法(SweepLineAlgorithm)leetcode数组专题06-leetcode.218the-skyline-problem力扣.218天际线问题leetcode数组专题06-leetcode.252meetingroom力扣.252会议室leetcode数组专题06-leetcode.253meetingroomii力扣.253......