单调栈
739. 每日温度
题意:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
实例:
思路:本题作为单调栈的第一道题,我们需要了解什么是单调栈?单调栈中存储的是什么??
单调栈,顾名思义就是利用栈和队列的特殊结构去解决问题。而栈中存储的则需我们需要遍历的元素。
对于本题,我们需要做的就是按照一定规律将元素一次性遍历完。单调栈中存储的则是我们遍历元素的下标。根据题意:单调栈中存储的是一个增序序列,即从顶到底元素依次增大,当需要对比的元素大于栈顶元素时,就说明栈顶元素的第一个比他大的元素找到了,就可以输出arr[s.top()]=i-s.top();并且释放保存的栈顶元素,证明其没有作用了,循环遍历,直到站内没有元素或该对比元素小于栈顶元素时,就说明结束本次遍历,将对比元素temperatures[i]保存起来。遍历完所有元素,本题结束
C++代码:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> arr(temperatures.size(),0);
stack<int> s;
s.push(0);
for(int i=1;i<temperatures.size();i++)
{
while(!s.empty()&&temperatures[i]>temperatures[s.top()])
{
arr[s.top()]=i-s.top();
s.pop();
}
s.push(i);
}
return arr;
}
496. 下一个更大元素 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] 是如上所述的 下一个更大元素 。
实例:
思路:本题我们采用两次for循环,先创建一个数组tmp,用于存储nums2中每个元素的下一个比它大的元素值,然后在使用一次for循环,找到nums1中的元素,并将对应的最大值保存到数组arr中。虽然这个代码写起来有点重复,但是这组代码的时间复杂程度还是O(n^2);还有一种做法是给出一个map用于保存nums1和nums2的映射关系,我觉得还是太占用空间了,这里就没有给出。
C++代码:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> tmp(nums2.size(),-1);
stack<int> s;
s.push(0);
for(int i=1;i<nums2.size();i++)
{
while(!s.empty()&&nums2[i]>nums2[s.top()])
{
tmp[s.top()]=nums2[i];
s.pop();
}
s.push(i);
}
vector<int> arr(nums1.size());
for(int i=0;i<nums1.size();i++)
{
for(int j=0;j<nums2.size();j++)
{
if(nums1[i]==nums2[j])
{
arr[i]=tmp[j];
}
}
}
return arr;
}