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

news2024/11/18 0:35:17

算法学习——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.coloradmin.cn/o/1443416.html

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

相关文章

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介官网&#xff1a; [https://clickhouse.com/docs/zh](https://clickhouse.com/docs/zh) 1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景…

Tuxera NTFS2024永久免费版磁盘读写软件

Tuxera NTFS 2024由Tuxera公司开发&#xff0c;是一款专为Mac系统设计的NTFS磁盘读写软件。以下是这款软件的具体优势&#xff1a; 全面的读写功能&#xff1a;Tuxera NTFS 2024允许Mac用户全面读写NTFS格式的硬盘、U盘、SD卡等存储设备。这意味着用户可以在Mac上自由读取和写…

Android Graphics 图像显示系统 - 开篇

“ 随着学习的不断深入和工作经验的积累&#xff0c;欲将之前在博客中整理的Android Graphics知识做进一步整理&#xff0c;并纠正一些理解上的错误&#xff0c;故开设Graphics主题系列文章 ” 序言 由于工作需要&#xff0c;也源于个人兴趣&#xff0c;终于下决心花时间整理一…

gem5学习(19):gem5内存系统——The gem5 Memory System

目录 一、Model Hierarchy 二、CPU 三、Data Cache Object 四、Tags & Data Block 五、MSHR and Write Buffer Queues 六、Memory Access Ordering 七、Coherent Bus Object 八、Simple Memory Object 九、Message Flow 1、Memory Access Ordering&#xff08;re…

[每周一更]-(第86期):PostgreSQL入门学习和对比MySQL

入门学习PostgreSQL可以遵循以下步骤&#xff1a; 安装 PostgreSQL&#xff1a; 首先&#xff0c;你需要在你的计算机上安装 PostgreSQL。你可以从 PostgreSQL 官方网站 下载适合你操作系统的安装包&#xff0c;并按照官方文档的指导进行安装。 学习 SQL&#xff1a; PostgreS…

【JS逆向三】逆向某某网站的sign参数,并模拟生成仅供学习

逆向日期&#xff1a;2024.02.06 使用工具&#xff1a;Node.js 类型&#xff1a;webpack 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加解密工具 1、打开某某…

深入理解Go的垃圾回收机制

导语 如果你是一位Golang的开发者&#xff0c;你一定对于语言特性和详细结构有所了解。但是&#xff0c;你是否曾经停下来深入研究过Golang背后复杂而强大的垃圾回收&#xff08;GC&#xff09;机制&#xff1f;在这篇文章中&#xff0c;我们将具体深入探讨Golang垃圾回收机制…

fast.ai 深度学习笔记(三)

深度学习 2&#xff1a;第 1 部分第 6 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-6-de70d626976c 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…

HiveSQL——不使用union all的情况下进行列转行

参考文章&#xff1a; HiveSql一天一个小技巧&#xff1a;如何不使用union all 进行列转行_不 union all-CSDN博客文章浏览阅读881次&#xff0c;点赞5次&#xff0c;收藏10次。本文给出一种不使用传统UNION ALL方法进行 行转列的方法,其中方法一采用了concat_wsposexplode()方…

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…

【Vue3】解决路由缓存问题(响应路由参数的变化)

官方文档解释&#xff1a; 解决问题的思路: 让组件实例不复用,强制销毁重建监听路由变化,变化之后执行数据更新操作 方案一&#xff1a;给router-view添加key 以当前路由完整路径为key 的值&#xff0c;给router-view组件绑定 <RouterView :key"$route.fullPath&qu…

部门人力分配 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求&#xff0c;需求用 requirements[i] 表示&#xff0c;requirements[i] 表示第 i 个需求的工作…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Turbo编码原理

目录 Turbo码&#xff1a;无线通信中的革命性技术 引言 一、Turbo码的基本原理 1.1 卷积码基础&#xff1a; 1.2 Turbo码的构造&#xff1a; 1.2.1 分量编码器 1.2.2 随机交织器 1.2.3 穿刺和复接单元 1.3 编码器结构的重要性和影响 1.4 迭代解码&#xff1a; 1.4.1 …

HiveQL——不借助任何外表,产生连续数值

注&#xff1a;参考文章&#xff1a; HiveSql一天一个小技巧&#xff1a;如何不借助其他任何外表&#xff0c;产生连续数值_hive生成连续数字-CSDN博客文章浏览阅读1.3k次。0 需求描述输出结果如下所示&#xff1a;12345...1001 问题分析方法一&#xff1a;起始值&#xff08;…

C++模版(初阶)

&#x1f308;函数复用的两种不恰当方式 ☀️1.函数重载 以Swap函数为例&#xff0c;有多少种参数类型组合&#xff0c;就要重载多少个函数&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left,…

[职场] 俄语业务员是做什么的 #职场发展#媒体

俄语业务员是做什么的 俄语业务员作为我国企业开展对俄贸易的重要人才&#xff0c;他们需要不断提高自身的专业技能和综合素质&#xff0c;以适应不断变化的市场环境和企业发展需求&#xff0c;为中俄两国经贸合作做出更大的贡献。 一、俄语业务员是什么 俄语业务员是指以俄语…

SpringBoot全局异常捕获处理实现方案

在Spring Boot中实现全局异常处理可以通过以下方式&#xff1a; 使用ControllerAdvice注释创建一个全局异常处理类&#xff0c;并使用ExceptionHandler注释来定义具体异常的处理方法。 import your.package.IllegalNumberException; import org.springframework.http.HttpSta…

【数据结构】链表OJ面试题5(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

3D裸眼技术行业研究:2026年市场投资规模为10.78亿元

3D裸眼技术大多处于研发阶段&#xff0c;它的研发分两个方向&#xff0c;一是硬件设备的研发&#xff0c;二为显示内容的处理研发。第二种已经开始小范围的商业运用。大众消费者接触的不多。从技术上来看&#xff0c;3D裸眼可分为光屏障式(Barrier)、柱状透镜(Lenticular Lens)…