【JavaScript】LeetCode:76-80

embedded/2024/10/20 8:57:04/

文章目录

  • 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/embedded/128948.html

相关文章

开篇:SpringBoot与SpringCloud的那些事

在正式开始研究 SpringCloud 的技术之前&#xff0c;咱先简单的用比较短的篇幅聊一点概述性质的东西&#xff0c;让思维活跃起来。 SpringCloud与SpringBoot的关系和对比 一开始学习 SpringCloud 咱就知道&#xff0c;SpringCloud 的技术大多都不是自己造的&#xff0c;都是整合…

MySQL的并行复制原理

1. 并行复制的概念 并行复制&#xff08;Parallel Replication&#xff09;是一种通过同时处理多个复制任务来加速数据复制的技术。它与并发复制的区别在于&#xff0c;并行复制更多关注的是数据块或事务之间的并行执行&#xff0c;而不是单纯的任务并发。在数据库主从复制中&…

基于netty实现简易版rpc服务-理论分析

1.技术要点 1.1 rpc协议 定义一个rpc协议类&#xff0c;用于rpc服务端和客户端数据交互。 1.2 netty粘包半包处理 由于数据传说使用tcp协议&#xff0c;rpc协议的数据在网络传输过程中会产生三种情况&#xff1a; 1&#xff09;刚好是完整的一条rpc协议数据 2&#xff09;不…

如何给手机换ip地址

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时出于隐私保护、网络访问需求或其他特定原因&#xff0c;我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法&#xff0c;帮助您轻松实现手机IP…

苍穹外卖学习笔记(二十三)

拒单 OrderController /*** 拒单*/PutMapping("/rejection")ApiOperation("拒单")public Result rejection(RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception {orderService.rejection(ordersRejectionDTO);return Result.success(…

记录一个容易混淆的 Spring Boot 项目配置文件问题

记录一个容易混淆的 Spring Boot 项目配置文件问题 去年&#xff0c;我遇到了这样一个问题&#xff1a; 在这个例子中&#xff0c;由于密码 password 以 0 开头&#xff0c;当它被 Spring Boot 的 bean 读取时&#xff0c;前导的 0 被自动去掉了。这导致程序无法正确读取密码。…

探索GenAI/大模型评估与对比:AutoArena开源框架及产品介绍

在生成式人工智能(GenAI)和大型语言模型(LLM)快速发展的今天,如何准确、高效地评估这些模型的性能变得尤为重要。为此,社区中的朋友询问是否有专门用于GenAI和大模型评估与对比的工具。本文将介绍一个强大的开源框架——AutoArena,它专为自动化GenAI评估设计,特别适合于…

源码编译方式安装htppd软件

一.源码编译安装httpd软件 1.安装阿帕奇的依赖&#xff0c;安装apr软件&#xff0c;阿帕奇正常运行的环境这个环境就是apr。 2.安装apr-util软件&#xff0c;主要提供针对apr环境的管理工具&#xff0c; 3.安装阿帕奇软件即httpd软件。 如上图所示&#xff0c;就是三个软件的…