代码随想录算法训练营第四十五天| 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 }