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(),栈里储存的元素为变化后的下标