首页 > 编程语言 >24暑假算法刷题 | Day11 | LeetCode 150. 逆波兰表达式求值,239. 滑动窗口最大值,347. 前K个高频元素

24暑假算法刷题 | Day11 | LeetCode 150. 逆波兰表达式求值,239. 滑动窗口最大值,347. 前K个高频元素

时间:2024-07-13 21:27:33浏览次数:15  
标签:24 150 nums int pop numSt mq push 求值

目录


150. 逆波兰表达式求值

点此跳转题目链接

题目描述

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

提示:

  • 1 <= tokens.length <= 104
  • tokens[i] 是一个算符("+""-""*""/"),或是在范围 [-200, 200] 内的一个整数

题解

栈的经典题目 ✨

由于逆波兰表达式的特点,每个运算符总是要处理其前面的两个操作数。因此,可以采用栈存储表达式中的操作数,当遇到运算符时就弹出栈顶两个元素、进行运算,并把结果入栈。最后,这般处理完整个表达式,栈中剩余的唯一元素就是计算结果。

代码(C++)

int evalRPN(vector<string> &tokens)
{
    stack<int> numSt; // 存储数字的栈
    for (const string &token : tokens) { 
        if (token == "+") {
            int num1 = numSt.top();
            numSt.pop();
            int num2 = numSt.top();
            numSt.pop();
            numSt.push(num1 + num2);
        } else if (token == "-") {
            int num1 = numSt.top();
            numSt.pop();
            int num2 = numSt.top();
            numSt.pop();
            numSt.push(num2 - num1);
        } else if (token == "*") {
            int num1 = numSt.top();
            numSt.pop();
            int num2 = numSt.top();
            numSt.pop();
            numSt.push(num1 * num2);
        } else if (token == "/") {
            int num1 = numSt.top();
            numSt.pop();
            int num2 = numSt.top();
            numSt.pop();
            numSt.push(num2 / num1);
        } else 
            numSt.push(stoi(token)); // 数字无脑入栈即可
    }
    return numSt.top();
}

239. 滑动窗口最大值

点此跳转题目链接

题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

示例 2:

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

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • 1 <= k <= nums.length

题解

LeetCode标记 困难 \textcolor{red}{\text{困难}} 困难 题目

题目不难理解,可以先无脑写出暴力解法:

vector<int> maxSlidingWindowViolence(vector<int> &nums, int k)
{
    vector<int> res;
    int left = 0, right = k - 1;
    while (right < nums.size())
    {
        int maxNum = nums[left];
        for (int i = left + 1; i <= right; i++)
            maxNum = max(maxNum, nums[i]);
        res.push_back(maxNum);
        left++, right++;
    }
    return res;
}

不出意外地,在数据量大时超时了

标签:24,150,nums,int,pop,numSt,mq,push,求值
From: https://blog.csdn.net/weixin_54468359/article/details/140406213

相关文章

  • 24暑假算法刷题 | Day9 | LeetCode 151. 反转字符串中的单词,28. 找出字符串中第一个匹
    目录151.反转字符串中的单词题目描述题解28.找出字符串中第一个匹配项的下标题目描述题解459.重复的子字符串题目描述题解卡码网55.右旋字符串题目描述题解151.反转字符串中的单词点此跳转题目链接题目描述给你一个字符串s,请你反转字符串中单词的顺......
  • [20240618]Oracle C functions annotations.txt
    [20240618]OracleCfunctionsannotations.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/FritsHoog......
  • 2024/07/13(暑假学习hadoop第一周总结)
    在本周的学习中,我构建了学习Hadoop所需的基础环境,这包括安装虚拟机VMware和部署CentOS操作系统。这些步骤是学习Hadoop开始,也为是深入学习Hadoop技术做好前置的准备工作。下面将详细介绍如何安装VMware和部署CentOS系统:首先,我们需要下载VMware软件并进行安装。在安装过程中,请务必......
  • 2024 暑假友谊赛-热身2
    1.G-......
  • 南京大学计算理论之美 (Summer 2024)暑期学校游记
    day-nzero4338和我说有这么个暑校,报名了day0到了钟山风雨地,石头城下水南京到了南京大学(仙林校区),被硬件震撼了一波和zero4338两人互相贩卖焦虑:为啥还没预习这个,也没预习那个到了南京大学(鼓楼校区),和同学转鼓楼校区,和同学和zero4338和同学吃饭回酒店之后说预习预习,但是......
  • 福昕高级PDF编辑器专业版2024.2.0安装教程
    1、下载安装包2、双击安装程序进行安装3、修改安装位置,点击安装4、等待安装5安装完成,一定不能立即启用不要点击立即启用6、将patch的应用程序放到安装目录下面,双击启动7、点击应用8、执行完成,打开软件就可以用了如遇到福昕高级PDF编辑器失败,提示:本机已安装......
  • [lnsyoj300/luoguP3224/HNOI2012]永无乡
    题意给定\(n\)个集合,每个集合最开始只包含数\(a_i\),然后进行\(m\)次合并操作。具体地,每次操作将数\(a_i\)所在的集合与数\(a_j\)所在的集合合并。接下来,进行\(q\)次操作,每次操作可能为合并操作与查询操作,合并操作与上述相同,查询操作为查询数\(a_x\)所在的集合中第......
  • Spark _Exam_ 20240713
    SparkExam20240713Conclusion还可以,没有挂分(反向挂分什么鬼)。数据简直太平洋,T1放掉log,T330变80,T410%的特殊case变成30%的特殊casedp还是很不行,其他方面的思维还可以。A.不相邻集合(a)Statement称可重集合\(S\),若满足\(\forallx\inS,x-1\notinS,x+1\notinS\)......
  • 2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的
    2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。一个子数组nums[i..j]的大小为m+1,如果满足以下条件,则我们称该子数组与模式数组pattern匹配:1.若pattern[k]为1,则nums[i+k+1]>nums[i+k];......
  • 2024/7/13 每日一题:数组是否有序
    3011.数组是否可以变为有序给你一个下标从0开始且全是正整数的数组nums。一次操作中,如果两个相邻元素在二进制下数位为1的数目相同,那么你可以将这两个元素交换。你可以执行这个操作任意次(也可以0次)。如果你可以使数组变有序,请你返回true,否则返回false。......