Leetcode 496. 下一个更大元素I(简单) 503. 下一个更大元素II(中等) 739. 每日温度(中等) 单调栈
496. 下一个更大元素I(简单)
题目:
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
*
* 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
*
* 对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定
* nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
*
* 返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
即num2保存序列,num1保存nums2中的几个数字,返回nums1中对应数字在nums2中右侧比其大的第一个元素
思路:
单调栈+哈希表
先利用单调栈将nums2中每个元素对应的右侧第一大元素求出,并保存在哈希表中,然后遍历nums1从哈希表中取出结果。
单调栈用法,从后往前放入元素,放入一个元素前,退出比其小的所有元素。保障栈内按从后往前、从小到大压入。
class Solution { public: vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) { vector<int> ret; ret.resize(nums1.size()); stack<int> s; unordered_map<int,int> m; // 单调栈,从后往前压入元素 for(int i=nums2.size()-1;i>=0;--i){ // 将栈中比x小的元素全部退出 while(!s.empty()&&s.top()<=nums2[i]){ s.pop(); } //为空证明x最大,否则就是栈顶元素 m[nums2[i]]=s.empty()?-1:s.top(); //压入当前元素 s.push(nums2[i]); } //从哈希表中取出对应结果 for(int i=0;i<nums1.size();++i){ ret[i]=m[nums1[i]]; } return ret; } };
503. 下一个更大元素II(中等)
题目:
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的
* 下一个更大元素 。
*
* 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
思路:
可以将原数组扩展成两倍长度,就可以模拟成循环数组。
扩展两倍可以使用余数方式来实现
class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { int n=nums.size(); vector<int> ret(n); stack<int> s; //两倍长度,取余的方式来取值 for(int i=2*n-1;i>=0;--i){ //退出比x小的元素。当i<n时的赋值会覆盖n<i<2n时的结果 while(!s.empty()&&s.top()<=nums[i%n]){ s.pop(); } ret[i%n]=s.empty()?-1:s.top(); s.push(nums[i%n]); } return ret; } };
739. 每日温度(中等)
题目:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
思路:
单调栈保存下标,然后赋值时给出下标的差值
class Solution { public: vector<int> dailyTemperatures(vector<int>& temperatures) { int n=temperatures.size(); vector<int> ret(n); stack<int> s; for(int i=n-1;i>=0;--i){ while(!s.empty()&&temperatures[s.top()]<=temperatures[i]){ s.pop(); } ret[i]=s.empty()?0:(s.top()-i); s.push(i); } return ret; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=