【JavaScript】LeetCode:76-80

server/2024/10/20 15:13:12/

文章目录

  • 76 有效的括号
  • 77 最小栈
  • 78 字符串解码
  • 79 每日温度
  • 80 柱形图中最大的矩形

76 有效的括号

在这里插入图片描述

  • 三种不匹配的情况:
    1. ( [ { } ] ( ),最左边的"("多余,即字符串遍历完了,栈还不为空。
    2. [ { ( } } ],中间"( }"不匹配。
    3. [ { } ] ( ) ) ),右边三个")"多余,即字符串还未遍历完,栈空了。
  • 如果遇见左括号,就将对应类型的右括号入栈,方便遇见右括号时进行匹配。
  • 如果遇见右括号,就与栈顶元素进行比较,相同则将栈顶元素出栈,不同则返回false。
  • 在此基础上还可以剪枝操作:if(s.length % 2 != 0) return false;,如果括号的数量是奇数,直接返回false。
javascript">/*** @param {string} s* @return {boolean}*/
var isValid = function(s) {let st = [];for(let i of s){if(i == '('){st.push(')');}else if(i == '{'){st.push('}');}else if(i == '['){st.push(']');}else if(i == st[st.length - 1]){st.pop();}else if(st.length == 0 || i != st[st.length - 1]){return false;}}return st.length == 0;
};

77 最小栈

在这里插入图片描述

  • 增加一个辅助栈:minst,栈顶元素放置栈st中的最小值。
  • push():若push进来的数 <= minst的栈顶元素,则将该数加入minst中。
  • pop():若要pop的数 = minst的栈顶元素,则同时将minst.pop()。
  • 保证minst的栈顶元素始终是st中的最小值。
javascript">var MinStack = function() {this.st = [];this.minst = [];
};/** * @param {number} val* @return {void}*/
MinStack.prototype.push = function(val) {this.st.push(val);if(this.minst.length == 0 || val <= this.minst[this.minst.length - 1]){this.minst.push(val);}
};/*** @return {void}*/
MinStack.prototype.pop = function() {if(this.st.pop() == this.minst[this.minst.length - 1]){this.minst.pop();}
};/*** @return {number}*/
MinStack.prototype.top = function() {return this.st[this.st.length - 1];
};/*** @return {number}*/
MinStack.prototype.getMin = function() {return this.minst[this.minst.length - 1];
};/*** Your MinStack object will be instantiated and called as such:* var obj = new MinStack()* obj.push(val)* obj.pop()* var param_3 = obj.top()* var param_4 = obj.getMin()*/

78 字符串解码

在这里插入图片描述

  • num:存放当前括号前的数字,注意:可能是多位数。
  • res:存放当前括号中的字母。
  • st:栈中存放[num,前一个括号到当前括号之间的res]。
  • 遍历字符串数组:
    1. 如果是数字,则num中存数字。
    2. 如果是"[",则将num和前一段的字符串入栈。
    3. 如果是"]",则栈顶元素出栈,将前一段的字符串和num个该段字符串拼接。
    4. 如果是字母,就拼接当前段的字符串。
javascript">/*** @param {string} s* @return {string}*/
var decodeString = function(s) {let st = [];let res = "";let num = 0;for(let i of s){if(!isNaN(i)){num = num * 10 +  Number(i);}else if(i == "["){st.push([num, res]);res = "";num = 0;}else if(i == "]"){let tmp = st.pop();res = tmp[1] + res.repeat(tmp[0]);}else{res += i;}}return res;
};

79 每日温度

在这里插入图片描述

  • 单调栈
  • 单调递增栈:求左 / 右第一个比当前元素(栈顶元素)大的位置。
  • 单调递减栈:求左 / 右第一个比当前元素(栈顶元素)小的位置。
  • 此题需构造一个单调递增栈st,栈中存储元素对应的下标。
  • 单调栈是为了存放之前遍历过的元素。
  • 遍历温度数组,若当前元素 > 栈顶元素,则记录结果,栈顶元素出栈,当前元素入栈;若当前元素 <= 栈顶元素,当前元素入栈。
  • 结果数组res可以初始化为0,以便于如下情况:温度数组遍历完成后,栈中仍然有元素,此时栈中元素的后面都没有比自己大的值,对应的结果应该为0。
javascript">/*** @param {number[]} temperatures* @return {number[]}*/
var dailyTemperatures = function(temperatures) {let answer = Array(temperatures.length).fill(0);let st = [];st.push(0);for(let i = 1; i < temperatures.length; i++){if(temperatures[i] <= temperatures[st[st.length - 1]]){st.push(i);}else{while(st.length != 0 && temperatures[i] > temperatures[st[st.length - 1]]){answer[st[st.length - 1]] = i - st[st.length - 1];st.pop();}st.push(i);}}return answer;
};

80 柱形图中最大的矩形

在这里插入图片描述

  • 单调栈
  • 技巧:heights数组首尾各加一个0,以便于第一个数和最后一个数计算矩形面积。
  • 此题需构造一个单调递减栈st,栈中存储元素对应的下标。
  • 遍历柱状图数组,若当前元素 >= 栈顶元素,当前元素入栈;若当前元素 < 栈顶元素,计算矩形面积并更新最大值。
  • 如果当前元素 < 栈顶元素,说明此时以栈顶元素为基准,左、右两端的矩形高度均小于栈顶元素的高度,此时应计算矩形面积,高h = 栈顶元素对应的高度,宽w = 当前元素的下标 - 下一个栈顶元素中存放的下标 - 1,面积s = h * w。
javascript">/*** @param {number[]} heights* @return {number}*/
var largestRectangleArea = function(heights) {let st = [];let res = 0;heights.unshift(0);heights.push(0);st.push(0);for(let i = 1; i < heights.length; i++){if(heights[i] >= heights[st[st.length - 1]]){st.push(i);}else{while(heights[i] < heights[st[st.length - 1]]){let h = heights[st[st.length - 1]];st.pop();let w = i - st[st.length - 1] - 1;res = Math.max(res, h * w);}st.push(i);           }}return res;   
};

http://www.ppmy.cn/server/133375.html

相关文章

从零开始的LeetCode刷题日记:104. 二叉树的最大深度

一.相关链接 题目链接&#xff1a;104. 二叉树的最大深度 二.心得体会 这道题思路很简单&#xff0c;在遇到叶子节点的时候返回0&#xff0c;然后分别求左右子树的深度&#xff0c;最后加上本身节点的一个深度。因为是从树的深度&#xff0c;所以从下往上统计&#xff0c;即…

SVN小乌龟 create patch 和 apply patch 功能

在SVN&#xff08;Subversion&#xff09;版本控制系统中&#xff0c;使用“小乌龟”&#xff08;TortoiseSVN&#xff09;这个图形界面工具可以极大地简化SVN操作。TortoiseSVN中的“create patch”和“apply patch”是两个非常有用的功能&#xff0c;它们与版本控制中的补丁&…

使用LSPatch+PlusNE修改手机软件

一、问题概述 国内使用一些软件&#xff0c;即使科学上网&#xff0c;打开都是网络错误&#xff0c;更换节点同样如此。 二、软件下载 通过官网或者正规商店(如Google play)下载并且安装。 是的&#xff0c;先要下载一个无法使用的版本&#xff0c;后续对其进行修改。 三、下…

深度学习:终身学习(Life-Long Learning)详解

终身学习&#xff08;Life-Long Learning&#xff09;详解 终身学习&#xff08;也称为持续学习或增量学习&#xff09;是机器学习中的一个重要研究领域&#xff0c;它关注如何使机器学习模型在完成一系列任务后&#xff0c;能够持续学习新任务&#xff0c;而不会忘记之前学到…

银行卡二三四要素验证接口-在线银行卡二三四要素验证-银行卡二三四要素验证API

接口简介&#xff1a;全面覆盖&#xff0c;支持所有带银联标识的银行卡; 高准确性-验证结果实时返回&#xff0c;准确率达99%; 银行卡二要素若是手机号卡号&#xff0c;不支持工商和农商行 接口地址&#xff1a;https://www.wapi.cn/api_detail/102/235.html 在线核验&#xff…

Linux-网络命令

Ping 命令 $ ping www.qq.com$ ping -c 5 www.qq.com netstat netstat 是一个用来查看网络状态的重要工具。 语法&#xff1a;netstat【选项】 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字l 仅列出有在 Li…

【MySQL 保姆级教学】表结构的操作(4)

表结构的操作 1. 定义和语法2. 创建表 CREATE2.1 创建表的本质2.2 表的存储引擎2.3 表的字符集和校验规则2.4 创建表实例 3. 查看表结构 DESC3.1 作用3.2 示例 4. 修改表结构 ALTER4.1 添加列 ADD4.2 修改列 MODIFY4.3 删除列 DROP4.4 更改列名 CHANGE 5. 修改表名 RENAME6. 删…

深度学习-29-AI大模型的相关知识和工业界AI项目落地的繁琐过程

文章目录 1 案例背景1.1 失败案例1.2 问题难点2 一般流程2.1 需求阶段2.2 打光阶段2.3 数据阶段2.4 算法设计阶段2.5 训练评估阶段2.6 部署阶段2.7 运维阶段3 AI大模型的相关知识3.1 AI大模型的技术原理3.2 国内外主要AI大模型的高级应用3.3 AI大模型的提示词编写技巧3.4 AI辅助…