当前位置: 首页 > news >正文

代码随想录第46期 单调栈

这道题主要是单调栈的简单应用

class Solution {
public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i=1;i<T.size();i++){if(T[i]<=T[st.top()]){st.push(i);}else{while(!st.empty()&&T[i]>T[st.top()]){result[st.top()]=i-st.top();st.pop();}st.push(i);}}return result;}
};

暴力模拟

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> result;for(int i=0;i<nums1.size();i++){int j=0;while(nums1[i]!=nums2[j]){j++;}while(j<nums2.size()&&nums1[i]>=nums2[j]){j++;}if(j>=nums2.size()){result.push_back(-1);}else{int val=nums2[j];result.push_back(val);}}return result;}
};

单调栈

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> result(nums1.size(),-1);stack<int> st;st.push(0);unordered_map<int, int> umap; // key:下标元素,value:下标for (int i = 0; i < nums1.size(); i++) {umap[nums1[i]] = i;}for(int i=1;i<nums2.size();i++){if(nums2[i]<=nums2[st.top()]){st.push(i);}else{while(!st.empty()&&nums2[i]>nums2[st.top()]){if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标result[index] = nums2[i];}st.pop();}st.push(i);}}return result;}
};

比上一题多了个处理循环的操作

可以是模拟循环

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(),-1);stack<int> st;st.push(0);for(int i=1;i<nums.size()*2;i++){if(nums[i%nums.size()]<=nums[st.top()]){st.push(i%nums.size());}else{while(!st.empty()&&nums[i%nums.size()]>nums[st.top()]){result[st.top()]=nums[i%nums.size()];st.pop();}st.push(i%nums.size());}}// 最后再把结果集即result数组resize到原数组大小result.resize(nums.size());return result;}
};

也可以是直接扩充数组

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.begin(), nums1.end());vector<int> result(nums.size(),-1);stack<int> st;st.push(0);unordered_map<int,int> umap;for(int i=0;i<nums.size();i++){if(nums[i]<=nums[st.top()]){st.push(i);}else{while(!st.empty()&&nums[i]>nums[st.top()]){result[st.top()]=nums[i];umap[st.top()]=nums[i];st.pop();}st.push(i);}}// 最后再把结果集即result数组resize到原数组大小result.resize(nums.size() / 2);return result;}
};

这道题同样是一个双指针问题

class Solution {
public:int trap(vector<int>& nums) {
// max(min{左max,右max}-arr[i],0)
//预处理最大值  left:0-0最大值  0-1最大 0-i最大值
//          right:12-12最大值,11-12最大值 i-12最大值
/*int n=height.size();
int *lmax=new int[n];
int *rmax=new int[n];
lmax[0]=height[0];
for(int i=1;i<n;i++){
lmax[i]=max(lmax[i-1],height[i]);
}
rmax[n-1]=height[n-1];
for(int i=n-2;i>=0;i--){
rmax[i]=max(rmax[i+1],height[i]);
}
int ans=0;
for(int i=1;i<n-1;i++){ans+=max(0,min(lmax[i-1],rmax[i+1])-height[i]);
}return ans;*/
int l=0,r=nums.size()-1,lmax=nums[0],rmax=nums[nums.size()-1];
int ans=0;
while(l<=r){
if(lmax<=rmax){ans+=max(0,lmax-nums[l]);lmax=max(lmax,nums[l]);l++;
}else{ans+=max(0,rmax-nums[r]);rmax=max(rmax,nums[r]); r--;
}}
return ans;}};

与上一题类似,但是更麻烦些

双指针解法

class Solution {
public:int largestRectangleArea(vector<int>& heights) {vector<int> minLeftIndex(heights.size());vector<int> minRightIndex(heights.size());int size = heights.size();// 记录每个柱子 左边第一个小于该柱子的下标minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环for (int i = 1; i < size; i++) {int t = i - 1;// 这里不是用if,而是不断向左寻找的过程while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];minLeftIndex[i] = t;}// 记录每个柱子 右边第一个小于该柱子的下标minRightIndex[size - 1] = size; // 注意这里初始化,防止下面while死循环for (int i = size - 2; i >= 0; i--) {int t = i + 1;// 这里不是用if,而是不断向右寻找的过程while (t < size && heights[t] >= heights[i]) t = minRightIndex[t];minRightIndex[i] = t;}// 求和int result = 0;for (int i = 0; i < size; i++) {int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);result = max(sum, result);}return result;}
};

单调栈解法

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) { // 情况一st.push(i);} else if (heights[i] == heights[st.top()]) { // 情况二st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else { // 情况三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);}}st.push(i);}}return result;}
};

http://www.lryc.cn/news/486682.html

相关文章:

  • 中仕公考怎么样?事业编面试不去有影响吗?
  • OMV7 树莓派 tf卡安装
  • Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin
  • 【汇编】c++游戏开发
  • Android Studio | 修改镜像地址为阿里云镜像地址,启动App
  • Rocky linux8 安装php8.0
  • Ubuntu 18 EDK2 环境编译
  • C语言项⽬实践-贪吃蛇
  • 智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁
  • Spring:IoC/DI加载properties文件
  • Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
  • 深挖C++赋值
  • 【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
  • 【python笔记02】面向对象思想
  • Java基础-Java多线程机制
  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中
  • MATLAB向量元素的引用
  • leetcode-44-通配符匹配
  • 基于YOLOv8深度学习的智慧课堂学生专注度检测系统(PyQt5界面+数据集+训练代码)
  • vue项目使用eslint+prettier管理项目格式化
  • Java基础-组件及事件处理(中)
  • UNIX网络编程-TCP套接字编程(实战)
  • python编写一个自动清理三个月以前的邮件脚本
  • C++组合复用中,委托的含义与作用
  • 自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)
  • java 读取 有时需要sc.nextLine();读取换行符 有时不需要sc.nextLine();读取换行符 详解
  • Redis知识分享(三)
  • python安装包报错
  • Linux性能优化之火焰图简介
  • Unity类银河战士恶魔城学习总结(P129 Craft UI 合成面板UI)