#include<stack> --栈的头文件
栈的特点 : 先进后出 , 后进先出
相关函数:
top() 获取栈顶元素 ,返回栈顶元素的值
pop() 删除栈顶元素 ,没有返回值
push() 放入元素 ,没有返回值
empty() 为空返回 true 否则返回false
size() 元素的个数 ,返回值为 无符号整型
语法
stack<int> stk; //创建一个栈,里面的元素是int类型
739. 每日温度https://leetcode.cn/problems/daily-temperatures/
提示
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
思路
单调栈,单调栈使用的场景:左边或者右边第一个比他大或者小的。
创建一个栈,遍历数组,将第一个元素放入栈,每个元素与栈顶比较,当栈不为空且找到后面比栈顶大的一个元素,将栈顶元素弹出,然后利用下标返回数组对应的元素
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temp) {
stack<int>stk;
vector<int>res(temp.size(),0);
stk.push(0);
for(int i=1;i<temp.size();i++)
{
while(!stk.empty()&&temp[i]>temp[stk.top()])
{
res[stk.top()]=i-stk.top();
stk.pop();
}
stk.push(i);//不执行循环和循环结束都执行
}
return res;
}
};
496. 下一个更大元素 Ihttps://leetcode.cn/problems/next-greater-element-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]
是如上所述的 下一个更大元素 。
思路:
这个解法通过栈和哈希表来寻找
nums1
中每个元素在nums2
中的下一个更大元素。首先,使用哈希表记录nums1
中每个元素的位置。然后,遍历nums2
,利用栈来寻找每个元素右侧的第一个更大元素。如果当前元素大于栈顶元素,则找到了栈顶元素的下一个更大元素,此时更新结果数组。通过这种方式,能够高效地为nums1
中的每个元素找到其在nums2
中的下一个更大元素,如果不存在则结果为-1
。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int>stk;
map<int,int>m;
stk.push(0);
for(int i=0;i<nums1.size();i++)
{
m[nums1[i]]=i;
}
vector<int>res(nums1.size(),-1);
for(int i=1;i<nums2.size();i++)
{
//栈不为空 并且nums2[i]>nums2[stk[top]]
//说明stk.pop()这个位置找到了下一个更大元素
while(!stk.empty()&&nums2[i]>nums2[stk.top()])
{
if(m.find(nums2[stk.top()])!=m.end())
{
//m[nums2[stk.top()]]代表的是nums2[stk.top()]在nums1中的下标
res[m[nums2[stk.top()]]]=nums2[i];
}
stk.pop();//不管这个元素是不是nums1中的都要弹出否则会卡在这
}
stk.push(i);
}
return res;
}
};