代码随想录笔记--单调栈篇

2023-10-24 01:44

本文主要是介绍代码随想录笔记--单调栈篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1--单调栈

        使用单调栈的特征:寻找第一个比当前元素大或者小的元素。

2--每日温度

主要思路:

        基于单调栈,单调栈从栈顶开始递增;单调栈存储的是元素对应的索引。

        当遇到一个元素大于栈顶元素i时,计算 answer[i]。

#include <iostream>
#include <vector>
#include <stack>class Solution {
public:std::vector<int> dailyTemperatures(std::vector<int>& temperatures) {std::vector<int> res(temperatures.size(), 0);std::stack<int> stk;for(int i = 0; i < temperatures.size(); i++){while(!stk.empty() && temperatures[i] > temperatures[stk.top()]){res[stk.top()] = i - stk.top();stk.pop();}stk.push(i);}return res;}
};int main(int argc, char* argv[]){// temperatures = [73,74,75,71,69,72,76,73]std::vector<int> test = {73, 74, 75, 71, 69, 72, 76, 73};Solution S1;std::vector<int> res = S1.dailyTemperatures(test);for(auto num : res) std::cout << num << " ";std::cout << std::endl;return 0;
}

3--下一个更大元素I

主要思路:

        基于单调栈和哈希表。

        将 nums1 的元素映射为哈希表,其中 key 为 num1[i],val 为 i;

        遍历 nums2 构建单调栈,当 nums2[i] > stk.top() 时,且 stk.top() 属于 nums1,表明找到第一个比它大的元素,则根据hash_map[stk.top()]可以知道其在nums1的位置,记录结果res[hash_map[stk.top()]] = nums2[i] 即可。

#include <iostream>
#include <vector>
#include <stack>
#include <unordered_map>class Solution {
public:std::vector<int> nextGreaterElement(std::vector<int>& nums1, std::vector<int>& nums2) {std::vector<int> res(nums1.size(), -1);if(nums1.size() == 0) return res;std::unordered_map<int, int>hash_map;for(int i = 0; i < nums1.size(); i++) hash_map.emplace(nums1[i], i); // 存储值,索引std::stack<int> stk;for(int i = 0; i < nums2.size(); i++){while(!stk.empty() && nums2[i] > stk.top()){if(hash_map.find(stk.top()) != hash_map.end()){res[hash_map[stk.top()]] = nums2[i];}stk.pop();}stk.push(nums2[i]);}return res;}
};int main(int argc, char* argv[]){// nums1 = [4,1,2], nums2 = [1,3,4,2]std::vector<int> test1 = {4, 1, 2};std::vector<int> test2 = {1, 3, 4, 2};Solution S1;std::vector<int> res = S1.nextGreaterElement(test1, test2);for(auto num : res) std::cout << num << " ";std::cout << std::endl;return 0;
}

3--下一个更大元素II

主要思路:

        基于单调栈,本题的难点是针对一个循环数组,可以通过取模的操作来模拟循环数组。

#include <iostream>
#include <vector>
#include <stack>class Solution {
public:std::vector<int> nextGreaterElements(std::vector<int>& nums) {std::vector<int> res(nums.size(), -1);std::stack<int> stk;for(int i = 0; i < 2*nums.size(); i++){// 通过取模操作模拟有环的过程int idx = i % nums.size();while(!stk.empty() && nums[idx] > nums[stk.top()]){res[stk.top()] = nums[idx];stk.pop();}stk.push(idx);}return res;}
};int main(int argc, char* argv[]){// nums = [1, 2, 1]std::vector<int> test = {1, 2, 1};Solution S1;std::vector<int> res = S1.nextGreaterElements(test);for(int num : res) std::cout << num << " ";std::cout << std::endl;return 0;
}

这篇关于代码随想录笔记--单调栈篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271874

相关文章

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模