代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素 I

文章介绍了如何使用单调栈解决两个数组相关的问题:一是求每日温度中下一个比当前温度高的天数;二是寻找数组中的下一个更大元素。通过维护一个单调递增的栈,可以在O(n)的时间复杂度内找到每个元素的后续满足条件的元素的索引。
摘要由CSDN通过智能技术生成

每日温度

题目链接:力扣

T是一个栈结构

单调栈里 存放元素的下标i,
如果需要使用对应的元素,直接T[i]就可以获取。 

  • 情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
         则加入栈
  • 情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
         则加入栈
  • 情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
         则result[st.top()] = i - st.top()
         并将当前的栈顶元素弹出
         重复上述步骤,直到T[i]遇到大于它的栈顶元素,或者栈为空
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {

       stack<int> Mystack;
       vector<int>result(temperatures.size(),0);

       Mystack.push(0);

       for(int i=1;i<temperatures.size();i++)
       {
           if(temperatures[i] > temperatures[Mystack.top()]){
             while(!Mystack.empty() && temperatures[i] > temperatures[Mystack.top()])   //当前元素大于栈顶元素
                {
                    result[Mystack.top()] = i-Mystack.top();
                    Mystack.pop();
                 }
            Mystack.push(i);
           }
           
           else if(temperatures[i] <= temperatures[Mystack.top()])
           {
               Mystack.push(i);
           }
       }
       return result;     
    }
};

 下一个更大元素 I 

总体思路和上题一致,先得出nums2的result数组,再根据result推算出nums1各元素的下一个更大元素

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {

        vector<int>result(nums2.size(),0);
        vector<int>res(nums1.size(),-1);
        stack<int> ST;
        ST.push(0);

        for(int i=1 ; i<nums2.size();i++)
        {
            if(!ST.empty() && nums2[i] > nums2[ST.top()])
            {
                while(!ST.empty() && nums2[i] > nums2[ST.top()])
                {
                    result[ST.top()] = i-ST.top();
                    ST.pop(); 
                }
                ST.push(i);
            }
            else
            ST.push(i);
        }


        for(int i=0; i<nums1.size();i++)
          for(int j=0;j<nums2.size();j++)
          {
              if(nums1[i] == nums2[j])
              {
                  if(result[j] == 0)
                  res[i] = -1;
                  else
                  res[i] = nums2[j+result[j]];
              }
          }

          return res;

    }
};

 卡哥采用了map数据结构,使代码更精简
 

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; // key:下标元素,value:下标
        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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值