数据结构 之 栈与单调栈习题 力扣oj(附加思路版)

发布于:2024-03-28 ⋅ 阅读:(20) ⋅ 点赞:(0)

#include<stack> --栈的头文件

栈的特点 : 先进后出  , 后进先出

相关函数:

        top() 获取栈顶元素 ,返回栈顶元素的值

        pop() 删除栈顶元素  ,没有返回值

        push() 放入元素 ,没有返回值 

        empty() 为空返回 true  否则返回false

        size() 元素的个数 ,返回值为 无符号整型

语法

        stack<int> stk; //创建一个栈,里面的元素是int类型

739. 每日温度icon-default.png?t=N7T8https://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. 下一个更大元素 Iicon-default.png?t=N7T8https://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;
    }
};

本文含有隐藏内容,请 开通VIP 后查看