典型例题:求左边第一个比当前元素小的数 (模板,弄懂)

代码:

#include<iostream>
using namespace std;
#include<stack>
int main()
{//定义单调栈ststack<int>st;//输入元素个数int n;cin >> n;for (int i = 0; i < n; i++){int x;cin >> x;//当前元素小于等于栈顶元素,出栈while (!st.empty()&&st.top() >= x)//单调增取反{st.pop();}//如果栈为空,说明没有左面比当前元素更小的元素if (st.empty())cout << -1 << " ";else//如果栈不为空,则栈顶就是左面第一个比当前元素更小的元素cout << st.top() << " ";//当前元素进栈st.push(x);}return 0;
}

变式1:如果求左边第一个比当前元素大的元素用单调递减栈,只需要在while循环中条件改成st.top<=x(单调递减取反)

变式2:如果求右边第一个比当前元素大的元素,逆序遍历输入数组,此时左右相反,转换为变式2

变式3:如果求右边第一个比当前元素小的元素,逆转遍历输入数组,转换为例题

496. 下一个更大元素 I(变式3)

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int>map;
stack<int>st;
for(int i=nums2.size()-1;i>=0;i--)
{while(!st.empty()&&st.top()<=nums2[i]){st.pop();}if(st.empty()){map[nums2[i]]=-1;}else{map[nums2[i]]=st.top();}st.push(nums2[i]);
}
vector<int>res;
for(int i=0;i<nums1.size();i++)
{res.push_back(map[nums1[i]]);
}
return res;}
};

739. 每日温度(变式3)

右边第一个比当前元素大的元素的下标为变式3

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

503. 下一个更大元素 II

循环数组,用数组*2解决

转换为变式3

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {
vector<int>res(2*nums.size());
for(int i=0;i<nums.size();i++)
{res[i]=nums[i];
}
for(int i=0;i<nums.size();i++)
{res[i+nums.size()]=nums[i];
}
stack<int>st;
vector<int>ans(res.size());
for(int i=res.size()-1;i>=0;i--)
{while(!st.empty()&&st.top()<=res[i]){st.pop();}if(st.empty()){ans[i]=-1;}else{ans[i]=st.top();}st.push(res[i]);
}
vector<int>ress(ans.begin(),ans.begin()+nums.size());
return ress;}
};

【leetcode刷题笔记】单调栈相关推荐

  1. Leetcode刷题笔记:栈与队列篇

    基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...

  2. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  3. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  4. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  5. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  6. 【leetcode刷题笔记】动态规划

    #[leetcode刷题笔记]动态规划 石子游戏 public boolean stoneGame(int[] piles) {int N = piles.length;// dp[i][j] is ...

  7. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  8. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

  9. LeetCode刷题笔记第6题:Z字形变换

    LeetCode刷题笔记第6题:Z字形变换 想法: 要完成字符串根据给定的行数从上往下,从左到右完成Z字形排列.当只有一行时直接返回原字符串,当行数大于1时,先以行数构建一个行数数值个空字符串的列表, ...

  10. leetcode刷题笔记——二分查找

    leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...

最新文章

  1. 我被编程语言PUA了!用互联网黑话写代码,每天都在“赋能”变量
  2. 看!那全球最伟大的人工智能女性科学家们!
  3. serializable接口_Java Serializable:明明就一个空的接口嘛
  4. python中 getnode用法_node.js 爬虫入门总结
  5. Spring4.0之四:Meta Annotation(元注解)
  6. python统计文件字数_python统计文本文件的字数
  7. struct多种声明定义写法的小结
  8. MySql中执行 GROUP BY 分组 遇到 1055错误
  9. mysql添加一个字段(
  10. 古代皇帝的某祖某宗,有什么讲究
  11. nyoj20吝啬得过度(DFS)
  12. CISC 332*/CMPE 332* –Database Management Systems
  13. linux备份没有vmlinuz,解决file /isolinux/vmlinuz0 not found
  14. 如何申请并使用 eepromARMtool 工具
  15. 联想台式计算机重装系统教程,台式机装系统步骤 联想台式电脑怎么重装系统...
  16. 英特尔最新超级计算机,全球超级计算机500强三分之二使用英特尔的处理器
  17. ROS学习笔记-创建订阅cmd_vel话题节点
  18. 何恺明新作品:VITDet
  19. Android Drawable 与 LayerList综合汇总
  20. KerberosSDR新手入门测试

热门文章

  1. Android开发学习笔记---搭建Android开发环境
  2. 《程序设计技术基础》第1-5章例程
  3. Bailian4030 统计单词数【文本处理】
  4. HDU1420 Prepared for New Acmer【快速模幂】
  5. NUC1333 Knight Moves【DFS】
  6. Vijos P1304 回文数【回文+进制】
  7. I00008 百鸡问题
  8. IE、Chrome、Firefox 三大浏览器对比
  9. 目标识别(object detection)中的 IoU(Intersection over Union)
  10. 极简代码(五)—— 斐波那契数列