算法学习——LeetCode力扣栈与队列篇2

算法学习——LeetCode力扣栈与队列篇2

在这里插入图片描述

150. 逆波兰表达式求值

150. 逆波兰表达式求值 - 力扣(LeetCode)

描述

给你一个字符串数组 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] 内的一个整数

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

代码解析

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> my_stack;

        for(int i=0 ; i<tokens.size() ;i++)
        {  
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/") 
            {
                long long tmp1 = my_stack.top();
                my_stack.pop();
                long long tmp2 = my_stack.top();
                my_stack.pop();
                // cout<<tmp2<<' '<<tmp1<<endl;
                if(tokens[i] == "+")
                    my_stack.push( tmp2+tmp1);
                else if(tokens[i] == "-")
                    my_stack.push( tmp2-tmp1);
                else if(tokens[i] == "*")
                    my_stack.push(tmp2*tmp1);
                else if(tokens[i] == "/")
                    my_stack.push(tmp2/tmp1 );
            }else
                my_stack.push(stoi(tokens[i]));
        }
        return my_stack.top();
    }
};

239. 滑动窗口最大值

239. 滑动窗口最大值 - 力扣(LeetCode)

描述

给你一个整数数组 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

代码解析

双向队列(超时)
class Solution {
public:

    int find_max(deque<int> &my_win)
    {
        int resuelt = INT_MIN;
        for(int i=0 ; i<my_win.size() ;i++)
            if(my_win[i] > resuelt) resuelt = my_win[i];
        
        return resuelt;
    }
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> resuelt;
        deque<int> my_win;
        if(k > nums.size()) return resuelt; 

        for(int i=0 ; i<k;i++)
            my_win.push_back(nums[i]);

        resuelt.push_back(find_max(my_win));

        for(int i=k ; i<nums.size() ;i++)
        {
            int dele = my_win.front();
            my_win.pop_front();
            my_win.push_back(nums[i]);
            if(nums[i] > resuelt.back())
                resuelt.push_back(nums[i]);
            else if(dele == resuelt.back())
                resuelt.push_back(find_max(my_win));
            else 
                resuelt.push_back(resuelt.back());
        }
        return resuelt;
    }
};

单调队列
class Solution {
public:
    class MYdeque
    {
        deque<int> my_deque;
        public:
        void pop(int value)
        {
            if(my_deque.empty() != 1 && value == my_deque.front())
                my_deque.pop_front();
            return;
        }
        void push(int value)
        {
            while(my_deque.empty() != 1 && value > my_deque.back())
            {
                my_deque.pop_back();
            }
            my_deque.push_back(value);
            return;
        }

        int front()
        {
            return my_deque.front();
        }
    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> result;
        MYdeque my_deq;

        for(int i=0 ; i<k ; i++)
            my_deq.push(nums[i]);
        result.push_back(my_deq.front());
        for(int i=k; i<nums.size() ;i++)
        {
            my_deq.pop(nums[i-k]);
            my_deq.push(nums[i]);
            result.push_back(my_deq.front());
        }
        return result;
    }
};

347. 前 K 个高频元素

347. 前 K 个高频元素 - 力扣(LeetCode)

描述

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例

示例 1:

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

示例 2:

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

提示

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶

你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

代码解析

vector排序法
class Solution {
public:
	//对vector排序的谓词,前面加static
    static bool compare(pair<int, int> map1, pair<int, int> map2) 
    {
        return map1.second > map2.second;
    }

    vector<int> topKFrequent(vector<int>& nums, int k) {

        unordered_map<int, int> num_map; //map统计出现的次数
        vector<pair<int ,int >> buf; //缓存vector,用作排序
        vector<int> result;
        for( auto i:nums)
        {
            num_map[i]++; //统计出现的次数
        }
        for ( auto it : num_map) //将map中的数据存到vector中,用pair的形式
        {
            buf.push_back(make_pair(it.first, it.second)); 
            // cout<<it.first<<' '<<it.second<<endl;
        }
        sort(buf.begin(), buf.end(),compare);    //排序,按照value的大小排序

        for(int i = 0 ; i<k ;i++)
        {
            result.push_back(buf[i].first);   //前k个值为结果
        }
        return result;
    }
};

小顶堆
class Solution {
public:

    // 小顶堆的比较函数
    class mycomparison {
    public:
        bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
            return lhs.second > rhs.second;
        }
    };

    vector<int> topKFrequent(vector<int>& nums, int k) {

        unordered_map<int, int> num_map;
        vector<int> result;

        // 对频率排序
        // 定义一个小顶堆,大小为k
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison>  pri_que;

        for( auto i:nums)
        {
            num_map[i]++;
        }
        for ( auto it : num_map)
        {
            pri_que.push(it);
            if (pri_que.size() > k)// 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
            { 
                pri_que.pop();
            }
            
        }

        for(int i = k - 1; i >= 0; i--) //小顶堆,先出的小,倒着装入数组
        {
            result.push_back( pri_que.top().first);
            pri_que.pop();
        }

     
        return result;

    }
  
};

map排序
class Solution {
public:
    static bool cmp(const pair<int,int>&a, const pair<int,int>&b )
    {
        return a.second > b.second;
    }
    
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> my_map;
        vector<int> resulte;
        for(int i=0 ; i<nums.size() ;i++)
        {
            my_map[nums[i]]++;
        }

        vector<pair<int,int>> tmp(my_map.begin(),my_map.end()); 

        sort(tmp.begin(),tmp.end(),cmp);

        for(int i=0 ; i<k ;i++)
        {
            resulte.push_back(tmp[i].first);
        }

        return resulte;

    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

六、滚动条操作——调整图像亮度

亮度调整&#xff1a;在原来的图像基础上&#xff0c;对每个像素点值增加或减小&#xff0c;是图片整体亮度的增加或降低 项目最终效果&#xff1a;通过滚动条trackbar来实现调整图片亮度和对比度的功能 我这里创建的项目为&#xff1a;track_bar_light 一、创建滚动条调整图…

Spring基础 - SpringMVC请求流程和案例

Spring基础 - SpringMVC请求流程和案例 什么是MVC 用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时&#xff0c;不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理…

电商小程序06用户审核

目录 1 创建自定义应用2 显示待办数量3 创建审核页面4 开发审核功能5 搭建布局6 最终效果总结 上一篇我们讲解了用户注册的功能&#xff0c;用户注册之后状态是待审核&#xff0c;需要管理员进行审核。通常给管理员提供一套PC端的软件进行相关的操作&#xff0c;在低代码中&…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

【MySQL】数据库的基础——数据库的介绍、MySQL的介绍和架构、SQL分类、MySQL的基本使用、MySQL的存储引擎

文章目录 MySQL1. 数据库的介绍1.2 主流数据库 2. MySQL的介绍2.1 MySQL架构2.2 SQL分类2.3 MySQL的基本使用2.4 MySQL存储引擎 MySQL 1. 数据库的介绍 数据库&#xff08;Database&#xff0c;简称DB&#xff09;是按照数据结构来组织、存储和管理数据的仓库。它是长期存储在计…

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性&#xff01;感谢神州租车气温与游玩地点总体花费 游玩过程出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州…

数据分析基础之《pandas(7)—高级处理2》

四、合并 如果数据由多张表组成&#xff0c;那么有时候需要将不同的内容合并在一起分析 1、先回忆下numpy中如何合并 水平拼接 np.hstack() 竖直拼接 np.vstack() 两个都能实现 np.concatenate((a, b), axis) 2、pd.concat([data1, data2], axis1) 按照行或者列…

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

一周学会Django5 Python Web开发-Django5创建项目(用PyCharm工具)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(10)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述&#xff08;9&#xff09; 4.2 PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线&#xff0c;其作用与PCI总线类似&#xff0c;主要目的是为了连接处理器系统中的外部设备&…

C语言中的数据类型-强转

强制类型转换 概念&#xff1a;将某种类型的数据转化我们需要的数据类型&#xff0c;注意强制类型转化是临时强转&#xff0c;不会改变本身的数据类型。 强转又分为显式强转和隐式转化 显示强转是按照我们的要求进行转化 格式&#xff1a;(需要转化数据类型)变量名 #inclu…

C#,欧拉常数(Euler Constant)的算法与源代码

1 欧拉常数 欧拉常数最先由瑞士数学家莱昂哈德 欧拉 (Leonhard Euler) 在1735年发表的文章《De Progressionibus harmonicus observationes》中定义。欧拉曾经使用γ作为它的符号&#xff0c;并计算出了它的前6位&#xff0c;1761年他又将该值计算到了16位 。 欧拉常数最先由瑞…

Swift 使用 Combine 进行开发 从入门到精通七

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

Dubbo源码一:【Dubbo与Spring整合】

正常在项目中&#xff0c;我们都是在Spring环境下使用Dubbo&#xff0c;所以我们这里就在Spring的环境下看看Dubbo是如何运作的 入口 在源码下载下来之后&#xff0c;有一个dubbo-demo目录&#xff0c;里面有一个基于spring注解的子目录dubbo-demo-annotation, 里面有一个生产…

蓝桥杯每日一题------背包问题(二)

前言 本次讲解背包问题的一些延申问题&#xff0c;新的知识点主要涉及到二进制优化&#xff0c;单调队列优化DP&#xff0c;树形DP等。 多重背包 原始做法 多重背包的题意处在01背包和完全背包之间&#xff0c;因为对于每一个物品它规定了可选的个数&#xff0c;那么可以考虑…

M1 Mac使用SquareLine-Studio进行LVGL开发

背景 使用Gui-Guider开发遇到一些问题&#xff0c;比如组件不全。使用LVGL官方的设计软件开发 延续上一篇使用的基本环境。 LVGL项目 新建项目 选择Arduino的项目&#xff0c;设定好分辨率及颜色。 设计UI 导出代码 Export -> Create Template Project 导出文件如图…

vue+springboot前后端视频文件等的上传与展示(基于七牛云)

前言&#xff1a;在初步说明完成功能之前&#xff0c;我会把重要的部分说明下。后续我会细化。 vue视频文件上传 其实这里和图片这些文件就是一样的。因为上传只是把我们想在云端展示的文件按等传输到云端的bucket。然后方便网站去请求引用。 有人问我我就说明下。这种东西无…

Linux 36.2@Jetson Orin Nano之Hello AI World!

Linux 36.2Jetson Orin Nano之Hello AI World&#xff01; 1. 源由2. Hello AI World&#xff01;3. 步骤3.1 准备阶段3.2 获取代码3.3 Python环境3.4 重点环节3.5 软件配置3.6 PyTorch安装3.7 编译链接3.8 安装更新 4. 测试4.1 video-viewer4.2 detectnet4.3 演示命令 5. 参考…

问题:2、计算机网络的目标是实现________。 #媒体#知识分享

问题&#xff1a;2、计算机网络的目标是实现________。 A&#xff0e;数据处理 B&#xff0e;信息传输与数据处理 C&#xff0e;资源共享与信息传输 D&#xff0e;文献查询 参考答案如图所示

开发者实战 | 如何在 Windows 上调用 NPU 部署深度学习模型

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 OpenVINO™..♩~ ♫. ♪.. 相信很多小伙伴都已经知道&#xff0c;在最新一代的 Intel Core Ultra 移动端平台中已经集成了被称为 NPU 的神经网络加速处理器&#xff0c;以提供低功耗的AI算力&#xff0c;特别适合…