【JavaScript】LeetCode:96-100

embedded/2024/11/16 22:26:04/

文章目录

  • 96 单词拆分
  • 97 最长递增子序列
  • 98 乘积最大子数组
  • 99 分割等和子集
  • 100 最长有效括号

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。
javascript">/*** @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。
javascript">/*** @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])。
javascript">/*** @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])。
javascript">/*** @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
javascript">/*** @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;
};

http://www.ppmy.cn/embedded/138115.html

相关文章

沈阳乐晟睿浩科技有限公司抖音小店保障

在当今这个数字化时代&#xff0c;电子商务行业以其便捷性、高效性和广泛的覆盖面&#xff0c;成为了推动经济发展的新引擎。沈阳乐晟睿浩科技有限公司&#xff0c;作为这股变革洪流中的佼佼者&#xff0c;凭借其深厚的技术实力、敏锐的市场洞察力和前瞻性的战略布局&#xff0…

微服务架构面试内容整理-SpringCloud Netflix‌与Spring Cloud Alibaba比较

Spring Cloud Netflix 和 Spring Cloud Alibaba 都是用于构建微服务架构的解决方案,但它们在设计理念、组件和使用场景上存在一些差异。以下是它们的比较: 1. 服务注册与发现 ● Spring Cloud Netflix:使用 Eureka 作为服务注册和发现的组件。Eureka 是基于 REST 的,适合服…

php preg_match 不到内容,修改pcre.backtrack_limit解决问题

使用 preg_match 匹配不到内容&#xff0c;感觉是有字符串长度限制&#xff0c;经测试果然。 设置 pcre.backtrack_limit 大小解决问题 // php 文件中通过ini_set 修改 ini_set(pcre.backtrack_limit, 999999999); // 或 ini_set(pcre.backtrack_limit, -1);或是php.ini中修改…

机器学习—为什么我们需要激活函数

如果我们使用神经网络中每个神经元的线性激活函数&#xff0c;回想一下这个需求预测示例&#xff0c;如果对所有节点使用线性激活函数&#xff0c;在这个神经网络中&#xff0c;事实证明&#xff0c;这个大神经网络将变得与线性回归没有什么不同&#xff0c;所以这将挫败使用神…

游戏引擎学习第九天

视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据&#xff0c;改播放正弦波 下面主要讲关于浮点数 1. char&#xff08;字符类型&#xff09; 大小&#xff1a;1 字节&#xff08;8 位&#xff09;表示方式&#xff1a;char 存储的是一个字符的 A…

【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?

目录 一、背景描述 二、解决办法 三、清理效果 四、理论参考 解决方法 1. 清理未使用的 Docker 镜像、容器和卷 2. 查看 Docker 使用的磁盘空间 3. 调整 Docker 的存储位置 4. 增加磁盘空间 5. 调整 Docker Desktop 配置 6. 使用 Docker 清理工具&#xff08;例如 D…

PC上浏览器是如何查询DNS 缓存的呢?

通过 ipconfig /displaydns 的显示结果可以获取本机的 DNS 缓存信息&#xff0c;那么浏览器是如何获取本机的 DNS 缓存。 答案是&#xff1a;浏览器获取本机的 DNS 缓存主要是通过操作系统提供的接口来获取&#xff0c;。 具体的获取途径如下&#xff1a; 先查询自身缓存&am…

【鸿蒙开发】第十五章 H5与端侧交互、Cookies以及Web调试

目录 1. H5与端侧交互 1.1 应用侧调用前端页面函数 1.2 前端页面调用应用侧函数 1.2.1 复杂类型使用方法 1.3 建立应用侧与前端页面数据通道 2 管理页面跳转及浏览记录导航 2.1 历史记录导航 2.2 页面跳转 2.3 跨应用跳转 3 管理Cookie及数据存储 3.1 Cookie管理 3…