代码随想录算法训练营第58天|739. 每日温度|496.下一个更大元素 I
详细布置
739. 每日温度
今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。
大家可以读题,思考暴力的解法,然后在看单调栈的解法。 就能感受出单调栈的巧妙
https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(),0);
st.push(0);
/*
情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
*/
for(int i=1;i<temperatures.size();i++)
{
if(temperatures[i]<=temperatures[st.top()])//情况1、2
{
st.push(i);
}
else//情况3
{
while(!st.empty()&&temperatures[i]>temperatures[st.top()])
{
result[st.top()]=i-st.top();
st.pop();
}
st.push(i);
}
}
return result;
}
};
496.下一个更大元素 I
本题和 739. 每日温度 看似差不多,其实 有加了点难度。
https://programmercarl.com/0496.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0I.html
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums1.size(),-1);
if(nums1.size()==0)return result;
unordered_map<int,int> umap;
for(int i=0;i<nums1.size();i++)
umap[nums1[i]]=i;
st.push(0);
for(int i=1;i<nums2.size();i++)
{
while(!st.empty()&&nums2[i]>nums2[st.top()])
{
if(umap.count(nums2[st.top()])>0) // 看map里是否存在这个元素
{
int index=umap[nums2[st.top()]];// 根据map找到nums2[st.top()] 在 nums1中的下标
result[index]=nums2[i];
}
st.pop();
}
st.push(i);
}
return result;
}
};