739. 每日温度,496.下一个更大元素 I,503.下一个更大元素II,
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> result(temperatures.size(),0);st.push(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;}
};
这道题是运用了单调栈,单调栈就是栈里面的元素都是单调的,当新来的元素大于栈顶,栈顶要先弹出然后再加入新的元素成为栈顶,这道题栈里面的元素时时元素的数组下标,新进的元素都是和下标对应的数组进行比较,注意while循环里面要先判断栈是否为空再进行下一步判断,防止内存泄漏
496.下一个更大元素 I
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> result(nums1.size());vector<int> hash(10000,-1);stack<int> st;st.push(nums2[0]);for(int i=1;i<nums2.size();i++){while(!st.empty()&&nums2[i]>st.top()){hash[st.top()]=nums2[i];st.pop();}st.push(nums2[i]);}for(int i=0;i<nums1.size();i++){result[i]=hash[nums1[i]];}return result;}
};
这道题也是运用了单调栈,因为要求nums1的元素在nums2中的相同的元素的右边第一个大于它的元素,如果没有就为-1,则需要创建一个hash表来映射,result[i]=hash[nums1[i]],其他思路和每日温度思路相同,栈里储存的元素为nums2[i]
503.下一个更大元素II
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(),-1);stack<int> st;for(int i=0;i<2*nums.size();i++){int j=i%nums.size();while(!st.empty()&&nums[j]>nums[st.top()]){result[st.top()]=nums[j];st.pop();}st.push(j);}return result;}
};
整体代码和每日温度类似,对于首尾相连的环形数组,遍历长度扩展为两倍size,循环内下标为i%nums.size(),栈里储存的元素为变化后的下标