739.每日温度
题目链接 文章讲解 视频讲解
单调栈适合的场景:求当前元素左面或右面第一个比它大或小的元素
- 单调栈里存什么元素
只要存下标就可以了,比较元素时可以通过下标取元素 - 单调栈是单调增还是单调减(从栈顶到栈底)
使用单调增的单调栈
解题步骤:
- 遍历数组,当栈空时直接入栈
- 如果栈不空比较当前元素与栈顶元素,如果当前元素大于栈顶元素,则记录距离,并弹出栈顶元素
- 循环第二步直到栈空或者栈顶元素不小于当前元素,将当前元素入栈
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0);
for(int i = 0; i < temperatures.size(); ++i) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return result;
}
};
496.下一个更大元素I
思路:建立一个map映射,将nums1中的元素和下标做映射,使得根据元素可以获得下标
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums1.size(), -1);
unordered_map<int, int> umap;
for(int i = 0; i < nums1.size(); ++i) umap[nums1[i]] = i;
for(int i = 0; i < nums2.size(); ++i) {
while(!st.empty() && nums2[i] > st.top()) {
if(umap.find(st.top()) != umap.end())
result[umap[st.top()]] = nums2[i];
st.pop();
}
st.push(nums2[i]);
}
return result;
}
};
503.下一个更大的元素II
只需将数组遍历两遍,计算下标时使用i % nums.size()
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
vector<int> result(nums.size(), -1);
for(int i = 0; i < 2 * nums.size(); ++i) {
while(!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
result[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
return result;
}
};
标签:nums,元素,随想录,st,vector,result,更大,size
From: https://www.cnblogs.com/cscpp/p/18286689