单调栈

739. 每日温度

题意:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

实例:

算法练习-day46_单调栈

思路:本题作为单调栈的第一道题,我们需要了解什么是单调栈?单调栈中存储的是什么??

单调栈,顾名思义就是利用栈和队列的特殊结构去解决问题。而栈中存储的则需我们需要遍历的元素。

对于本题,我们需要做的就是按照一定规律将元素一次性遍历完。单调栈中存储的则是我们遍历元素的下标。根据题意:单调栈中存储的是一个增序序列,即从顶到底元素依次增大,当需要对比的元素大于栈顶元素时,就说明栈顶元素的第一个比他大的元素找到了,就可以输出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] 是如上所述的 下一个更大元素 。

实例:

算法练习-day46_单调栈_02

思路:本题我们采用两次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;
    }