刷题了:150. 逆波兰表达式求值 |239. 滑动窗口最大值 |347.前 K 个高频元素

news2024/11/23 22:19:33

150. 逆波兰表达式求值

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/
文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on/?spm_id_from=333.788&vd_source=e70917aa6392827d1ccc8d85e19e8375
介绍:
逆波兰表达式(Reverse Polish Notation,RPN),又称后缀表达式,是一种特殊的数学表达式表示方法。这种方法由波兰逻辑学家J・卢卡西维兹(J・Lukasewicz)于1929年首先提出。逆波兰表达式的特点是将运算符写在操作数(即运算量)的后面,并且整个表达式不包含括号,所有的计算按照运算符出现的顺序严格从左向右进行,不再考虑运算符的优先规则。
实现情况:
1、栈数据类型需要使用long long
2、弹出为什么这样操作?

long long num1 = st.top();//该方法返回栈顶元素的引用(但实际上在 C++ 中,由于栈中的元素是值类型,这里返回的是栈顶元素的拷贝)。然后,这个返回值(即栈顶元素的值)被赋值给变量 num1
 st.pop();// pop() 方法,该方法从栈中移除栈顶元素

3、遍历数组的方法

 for (string& token : tokens) 
 for (const string& token : tokens)
 for (int i = 0; i < tokens.size(); i++)

4、直接将字符串转换为 long long

st.push(stoll(token));
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;

        for (const string& token : tokens) {
            if (token == "+" || token == "-" || token == "*" || token == "/") {
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                if (token == "+")
                    st.push(num2 + num1);
                if (token == "-")
                    st.push(num2 - num1);
                if (token == "*")
                    st.push(num2 * num1);
                if (token == "/")
                    st.push(num2 / num1);
            } else {
                st.push(stoll(token));
            }
        }
        return st.top();
    }
};

在这里插入图片描述

239. 滑动窗口最大值

题目链接:https://leetcode.cn/problems/sliding-window-maximum/description/
文章讲解:https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1XS4y1p7qj/?spm_id_from=pageDriver&vd_source=e70917aa6392827d1ccc8d85e19e8375
实现情况:
1、que.back():它用于访问双端队列(std::deque)末尾的元素
在这里插入图片描述

class Solution {
private:
    class MyQueue {
    public:
        deque<int> que; // 定义队列
        // 入队操作 需要保持队列数值是单调从大到小
        void push(int value) {
            while (!que.empty() && value > que.back()) {
                que.pop_back();
            }
            que.push_back(value);
        }

        // 实现队列的出队函数
        void pop(int value) {
            if (!que.empty() && value == que.front()) {
                que.pop_front();
            }
        }

        // 因为队列数值是单调从大到小 ,查询当前队列里的最大值
        // 就是直接返回队列前端也就是front
        int front() { return que.front(); }

    };

    public : vector<int>
             maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for (int i = 0; i < k; i++) { // 先将前k的元素放进队列
            que.push(nums[i]);
        }
        result.push_back(que.front()); // 得到第一个最大值
        for (int i = k; i < nums.size(); i++) {
            que.pop(nums[i - k]); // 滑动窗口移除最前面元素
            que.push(nums[i]);    // 滑动窗口前加入最后面的元素
            result.push_back(que.front()); // 记录对应的最大值
        }
        return result;
    }
};

在这里插入图片描述

347.前 K 个高频元素

题目链接:https://leetcode.cn/problems/top-k-frequent-elements/description/
文章讲解:https://programmercarl.com/0347.%E5%89%8DK%E4%B8%AA%E9%AB%98%E9%A2%91%E5%85%83%E7%B4%A0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1Xg41167Lz/?spm_id_from=pageDriver&vd_source=e70917aa6392827d1ccc8d85e19e8375
实现情况:
难点:
1、怎么统计字符法人频率
2、怎么对频率排序,
3、确定前k排名的字符

大顶堆(堆头是最大元素),小顶堆(堆头是最小元素)常用统计高频和低频的问题

直接用priority_queue(优先级队列,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。

class Solution {
public:

    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> map;
        for (int n : nums) { // 讲需要统计的字符存入map
            map[n]++;
        }

        // 定义一个小顶堆 大小为k
        priority_queue<pair<int, int>, vector<pair<int, int>>,
                       decltype([](const pair<int, int>& lhs,
                                   const pair<int, int>& rhs) {
                           return lhs.second > rhs.second;
                       })>
            pri_que;

        // 扫描统计各个字符出现的频率,使用小顶堆存储记录
        for (unordered_map<int, int>::iterator it = map.begin(); it !=map.end();
             it++) {
            pri_que.push(*it);
            if (pri_que.size() > k) {
                pri_que.pop();
            }
        }

        // 因为小顶堆最先弹出的是最小的元素,这样需要倒序输出数组
        vector<int> result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;
    }
};
#include <queue>
#include <unordered_map>
#include <utility> // for std::pair
#include <vector>

class Solution {
public:
    std::vector<int> topKFrequent(std::vector<int>& nums, int k) {
        std::unordered_map<int, int> freqMap;
        // 统计每个数字的频率
        for (int num : nums) {
            freqMap[num]++;
        }

        // 使用默认的 priority_queue(大顶堆)
        std::priority_queue<std::pair<int, int>> pri_que;
        // 注意:这里我们不直接传递 lambda,因为默认就是大顶堆

        // 填充堆,只保留频率最高的 k 个元素
        for (const auto& entry : freqMap) {
            pri_que.push(entry);
            if (pri_que.size() > k) {
                pri_que.pop();
            }
        }

        // 构建结果向量,因为是大顶堆,所以直接弹出即可(无需倒序)
        std::vector<int> result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;
    }
};

在这里插入图片描述

总结

232.用栈实现队列
225. 用队列实现栈
-226. 有效的括号和1047. 删除字符串中的所有相邻重复项 和 逆波兰表达式求值 都是使用栈,解决方法类似
239. 滑动窗口最大值 :主要需要理解入队列操作,保持队列的数值从大到小排序
152. 347.前 K 个高频元素 了解大顶堆、小顶堆、map的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

食品管理系统

目录 第1章 系统概述 第2章 可行性研究 2.1 项目背景及意义 2.2 可行性研究 第3章 需求分析 3.1 功能性需求 第4章 总体设计 4.1 系统的功能模块图。 4.2各功能模块简介 4.3主要业务流程 第5章 详细设计 5.1 食品管理系统页面 5.2个人中心页面 5.3 系统管理页面 …

Linux编程:使用python或者shell获取系统信息

0. 概要 在日常的系统管理和性能监控中&#xff0c;获取系统信息是一个非常常见的需求。 本文将介绍如何使用Python和Shell脚本来获取这些系统信息。 1. 使用Python获取系统信息 使用psutil库来获取系统的CPU、内存、磁盘和网络信息。 1.1 安装psutil库 首先&#xff0c;我…

论文阅读——Wirelessly-Powered Wireless Sensor Platform

文章目录 摘要一、整流天线二、仿真结果三、系统测试总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/4403991 摘要 文章介绍了一种低功耗&#xff08;约10μW&#xff09;的2.45 GHz无线传感器平台&#xff0c;该平台包括一个三轴加速度计、温度计和皮肤电导…

开源大模型的格式转成GGUF,并量化后使用ollama推理

https://github.com/ggerganov/llama.cpphttps://github.com/ggerganov/llama.cpp使用到的工具: llama.cpp ollama 步骤 1、下载llama.cpp,并使用make编译 2、新建conda环境,安装llama.cpp里所需的库(requirements.txt) 3、下载需要量化的模型

15.C语言形式参数和实际参数的介绍及函数总结

形参和实参的介绍及函数总结 1.形式参数和实际参数2.获取两个最大的数3.关于函数的一些总结 1.形式参数和实际参数 实际参数可以是常量、变量、表达式 y get(1);//常量 y get(x);//变量 y get(x1);//表达式形参和实参数值相同&#xff0c;地址不同(传递参数是数值的传递)。 …

全能数据分析工具:Tableau Desktop 2019 for Mac 中文激活版

Tableau Desktop 2019 一款专业的全能数据分析工具&#xff0c;可以让用户将海量数据导入并记性汇总&#xff0c;并且支持多种数据类型&#xff0c;比如像是编程常用的键值对、哈希MAP、JSON类型数据等&#xff0c;因此用户可以将很多常用数据库文件直接导入Tableau Desktop&am…

python_基础编程_字典、集合

字典类型&#xff1a; 一、什么是字典 字典&#xff1a;是py内置的数据结构之一&#xff0c;与列表一样是一个可变的序列&#xff0c;以键值对的方式存储数据&#xff0c;是一个无序的序列 二、字典的原理 实现原理&#xff1a;Py根据key查找value所在的位置 三、字典的创…

Redhat 7.9上配置达梦数据库的DM 数据守护(DM Data Watch)

Redhat 7.9上配置达梦数据库的DM 数据守护&#xff08;DM Data Watch&#xff09; 一 基础环境 端口说明&#xff1a; 注&#xff1a; 主库已经安装软件&#xff0c;及创建数据库实例。并已开启归档模式。 [dmdbatest1 tool]$ disql sysdba/Dameng123 服务器[LOCALHOST:523…

Cuda入门

文章目录 下载使用NsightAPI__ldg 函数实现1. Sigmoid2. warpReduceSum 参考学习资料 下载使用Nsight https://developer.nvidia.com/nsight-systems/get-startedsudo ln -s /opt/nvidia/nsight-systems/2024.4.1/bin/nsys /bin/nsysnsys profile --statstrue addAPI __ldg …

kotlin协程-- 基础概念 ①|创建和使用

引言 首先先说一些相关概念 1.并发与并行 在操作系统中我们曾经学到过并发与并行 并发: 是同一个时刻只有一条指令在执行,其他指令没有再执行,但是由于CPU的时间片特别短,导致多个指令来回切换的时间间隔特别短,就好像是同一时间多条指令在执行。单核CPU与多核CPU都可以进…

渗透测试之漏洞 ms08-067 利用实验

实验背景 在安全服务项目中&#xff0c;需要对系统进行风险评估&#xff0c;其中风险评估的第一步:漏洞扫描即漏扫&#xff0c;在客户授权的前提下&#xff0c;对授权目标实施扫描并生成漏扫报告;在漏扫结束后&#xff0c;为了其准确性和完整性&#xff0c;还需对目标进行渗透…

FPGA FIFO IP核(3)- 仿真

仿真思路 如何在写入标志信号&#xff08;写入请求信号&#xff09;有效时将数据写入到FIFO中&#xff1f; 在调用模块代码中&#xff0c;pi_flag每四个时钟周期产生一个有效信号&#xff0c;即写请求信号。每次当pi_data检测到pi_flag信号有效时加1&#xff0c;从0~255循环变…

PDF怎么压缩?在线pdf压缩VS PDF压缩软件,谁更好用?10款工具详细多方位测评

PDF怎么压缩&#xff1f;PDF文件压缩可以使用本地文件压缩软件&#xff0c;也可以在网页上使用在线压缩工具一键压缩。 在日常工作和生活中&#xff0c;PDF文件因其跨平台性和良好的保持格式不变的能力而广受欢迎。然而&#xff0c;随着PDF文件内容的增加&#xff0c;文件大小也…

【JavaScript】详解Day.js:轻量级日期处理库的全面指南

文章目录 一、Day.js简介1. 什么是Day.js&#xff1f;2. 安装Day.js 二、Day.js的基本用法1. 创建日期对象2. 格式化日期3. 解析日期字符串4. 操作日期5. 比较日期 三、Day.js的高级功能1. 插件机制2. 国际化支持 四、实际应用案例1. 事件倒计时2. 日历应用 在JavaScript开发中…

如何免费实现网站HTTPS访问

在当今数字化的世界中&#xff0c;网络安全问题愈发凸显其重要性。对于网站而言&#xff0c;实现HTTPS访问已经成为提升用户信任度和保障数据安全的重要手段。然而&#xff0c;对于许多小型网站和个人博客来说&#xff0c;购买SSL证书可能是一笔不小的开销。下面将介绍如何免费…

基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)

基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序&#xff0c;可以方便管理人员对儿童预防接种预约微信小程序的管理&#xff0c;提高信息管理工作效率及查询…

【数据结构】单链表带头双向循环链表的实现

一、链表的概念及结构 1.链表的概念 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 2.链表的结构 一般讲的链表包括数据域和指针域&#xff1a; 二、链表的种类 实际中链表的结构…

云HIS系统源码,业务云协同和数据云协同的数字化医院信息系统

云HIS是利用云计算、大数据、物联网、移动互联网等技术&#xff0c;打造的一个安全、便捷、共享、协同的医疗互联网云生态平台。核心功能是业务云协同和数据云协同。云HIS具有可扩展、易共享、易协同、低成本、体验号、更便捷、易维护的优势&#xff0c;重新定义了数字化医院信…

Intel(R) Wireless-AC 9462 WLAN已关闭开不起来的可能原因

最近给老电脑机械师T90重装系统&#xff0c;装好各种驱动之后&#xff0c;发现无线功能开不起来&#xff0c;WLAN已关闭不管怎么操作都开不起来 最后尝试把笔记本的无线网卡重新插了一下就正常了

freertos的学习cubemx版

HAL 库的freertos 1 实时 2 任务->线程 3 移植 CMSIS_V2 V1版本 NVIC配置全部是抢占优先级 第四组 抢占级别有 0-15 编码规则&#xff0c; 变量名 &#xff1a;类型前缀&#xff0c; c - char S - int16_t L - int32_t U - unsigned Uc - uint8_t Us - uint…