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

算法 day 47 单调栈

正式进入单调栈环节。先学习了单调栈。

单调栈通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。

例如本题其实就是找找到一个元素右边第一个比自己大的元素,此时就应该想到用单调栈了。

那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?

单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。

每日温度

单调栈在这里的作用仅仅是一个索引,其实根本没有记录任何的温度元素。

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;  // 存储索引的栈st.push(0);     // 压入第一个索引vector<int> result(temperatures.size(), 0);for(int i = 1; i < temperatures.size(); i++){// 比较当前温度与栈顶索引对应的温度if(temperatures[i] <= temperatures[st.top()]){st.push(i);}else{// 当栈不为空且当前温度大于栈顶索引对应的温度while(!st.empty() && temperatures[i] > temperatures[st.top()]){result[st.top()] = i - st.top();  // 计算天数差st.pop();}st.push(i);}}return result;}
};

下一个更大元素

这还是简单题?比上一题还难。注意这里初始化要是-1.

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);if (nums1.size() == 0) return result;unordered_map<int, int> umap; // key:下标元素,value:下标for (int i = 0; i < nums1.size(); i++) {umap[nums1[i]] = i;}st.push(0);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;}
};

下一个最大元素2

如出一辙。

拼两组数组就行了。

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);if (nums.size() == 0) return result;stack<int> st;st.push(0);for (int i = 1; i < nums.size() * 2; i++) { // 模拟遍历两边nums,注意一下都是用i % nums.size()来操作if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());else 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());}}return result;}
};

http://www.dtcms.com/a/582906.html

相关文章:

  • 一个静态网站开发考虑什么绍兴建设局网站首页
  • 做网站练手项目广东新闻联播回看
  • JavaEE初阶——多线程(8)JUC的常见类
  • 全参数DeepSeek(671B)企业部署方案
  • 柳州网站开发网上申请店铺开网店的流程
  • Java与Swift完整语法对比手册
  • 网站系统环境的搭建微信公众平台小程序二维码怎么生成
  • 做吉祥物设计看什么网站wordpress 开头空格
  • dockerfile一个引号缺失带来的惨案
  • 做电子板报的网站wordpress 汽车租赁
  • 英文网站设计公司建网站的过程
  • 虚拟网站php专业型网站开发服务费会计处理
  • 东莞大朗网站建设公司怎么查看网站死链接
  • 站多多 福州网站建设益阳建设网站
  • 中科数测研究院议题入选Biohacking Village Labs,即将亮相东京CodeBlue大会
  • SpringCloud微服务保护与分布式事务知识点总结
  • Kubernetes脉络:从基础概念到核心架构的认知框架
  • Ascend C核函数执行全流程深潜:从rtKernelLaunch到硬件执行的完整解密
  • 海澜之家的网站建设目标中文官网资源
  • 食品 网站源码外贸出口公司网站建设方案
  • 沈阳建网站如何建设企业人力资源网站
  • 精准计算,终结经验主义:钢丝绳智能选型重塑吊装安全
  • 汽车智能驾驶 超声波雷达、毫米波雷达和激光雷达
  • 网站开发所需要的条件icp备案号是什么意思
  • 幂数加密(攻防世界)
  • DMA 实践拾遗
  • K8S重启之后无法启动故障排查 与 修复
  • 咸阳专业学校网站建设深圳建筑设计找工作哪个招聘网站
  • 企业营销网站建设规划江西 网站 建设 开发
  • 快速CAD转到PPT的方法,带教程