代码随想录算法训练营第四十五天| 739. 每日温度 496.下一个更大元素 I

739. 每日温度#

单调栈的思路:#

如果要找左边第一个比当前数字大的节点

这个栈里面存放的是index,大——》小

如果一个新节点,比栈顶大,那么就是栈顶的第一个大于它的节点

代码:#

复制代码
 1 // 单调栈:一维数组,寻找 元素右边,或者左边自己大或者小的元素的位置
 2 
 3 // 要求:找到比当前节点值高的最近节点距离
 4 // 思路:两层for?
 5 // 
 6 // 思路2:单调栈 —— 如何找到比当前节点大的最新节点
 7 // 注意:栈中存放的是Index
 8 // 先把所有的节点按照顺序,放到从大到小的栈里,然后如果遇到新的数据,比栈顶大,那么就是栈顶的最近大顶数据
 9 //
10 vector<int> dailyTemperatures(vector<int>& temperatures) {
11     vector<int> result(temperatures.size(), 0);
12     if (temperatures.size() == 1) return result;
13 
14     stack<int> stack_;
15     stack_.push(0);
16 
17     for (int i = 1; i < temperatures.size(); i++)
18     {
19         // 小于等于
20         if (temperatures[i] <= temperatures[stack_.top()])
21         {
22             stack_.push(i);
23         }
24         else
25         {
26             //如果当前节点大于,那么应该循环 直到当前节点小于等于顶点
27             while (!stack_.empty() && temperatures[i] > temperatures[stack_.top()])
28             {
29                 result[stack_.top()] = i - stack_.top() ;
30                 stack_.pop();
31             }
32             
33             stack_.push(i);
34         }
35     }
36 
37     return result;
38 }
复制代码

  496.下一个更大元素 I #

要求:#

有一个nums1索引,根据这个索引,找到nums2的下一个更大的元素

代码:#

复制代码
 1 // 根据nums1的顺序,找到对应的index,然后再找到他们是否由下一个更大的元素
 2 // 
 3 // 思路:先构造一个单调栈,找出来对于nums2来说,它的每一个节点对应的下一个最大节点步数
 4 // 然后再通过nums1,进行查找,把值放进去
 5 //
 6 vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
 7     stack<int> st;
 8     st.push(0);
 9 
10     // map value -> index
11     map<int, int> mp;
12 
13     for (int i = 1; i < nums2.size(); i++)
14     {
15         if (nums2[i] <= nums2[st.top()])
16         {
17             st.push(i);
18         }
19         else
20         {
21             while (!st.empty() && nums2[i] > nums2[st.top()])
22             {
23                 mp.insert(make_pair(nums2[st.top()],nums2[i]));
24 
25                 st.pop();
26             }
27 
28             st.push(i);
29         }
30     }
31     
32     vector<int> result;
33     for (int i = 0; i < nums1.size(); i++)
34     {
35         if (mp.find(nums1[i]) != mp.end())
36         {
37             result.push_back(mp[nums1[i]]);
38         }
39         else
40         {
41             result.push_back(-1);
42         }
43     }
44 
45     return result;
46 }
复制代码

 

posted @   博二爷  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
历史上的今天:
2021-08-03 C#使用正则获取路径中的文件名
2019-08-03 暑期——第五周总结(Web连接hbase数据库)
点击右上角即可分享
微信分享提示
CONTENTS