代码随想录算法训练营第四十五天| 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 @ 2023-08-03 10:07  博二爷  阅读(5)  评论(0编辑  收藏  举报