每日温度

问题理解

给定包含一个时间序列每日温度的整数数组,返回一个数组,数组第i位代表之后会有几天的温度高于当前。

思路:

暴力解法时间复杂度:m*2;

单调栈思路实现:

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> vec(temperatures.size(), 0);
        stack<int> st;
        //st.push (0);
        for (int i = 0; i < temperatures.size(); i++) {
             while(!st.empty()&&temperatures[i]>temperatures[st.top()]){
                vec[st.top()]=i-st.top();
                st.pop();
                }
                st.push(i);
        }
        return vec;
    }
};

小结

1.结果集中的每一个元素是在弹出的时候确认的。
2.每日的温度都会进栈,进去的是索引,索引是我们关心的。

下一个更大元素

题目理解

给出两个序列,在nums2中找出nums1的下一个更大的元素。

暴力解法

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> vec(nums1.size(),-1);
       for(int i=0;i<nums1.size();i++){
        for(int j=0;j<nums2.size();j++){
            if(nums2[j]==nums1[i]){
                for(int k=j+1;k<nums2.size();k++)
                if(nums2[k]>nums1[i]){
                    vec[i]=nums2[k];
                    break;
                }
            }
        }
       }
       return vec; 
    }
};

暴力解法时间复杂度:m*n;

单调栈解法

答案集合是由nums1索引的。

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> vec(nums1.size(),-1);
        unordered_map<int,int> umap;
        stack<int> st;
        st.push(0);
        for (int i = 0; i < nums1.size(); i++){
            umap[nums1[i]]=i;
        }
        for (int i = 1; i < nums2.size(); i++) {
            if(umap.count(nums2[st.top()])>0){
               while(!st.empty()&&nums2[i]>nums2[st.top()]){
                int index=umap[nums2[st.top()]];
                vec[index]=nums2[i];
                st.pop();
                } 
            }
                st.push(i);
        }
       return vec; 
    }
};

更大元素2

题目描述

给定一个循环数组,求该数组每一个元素之后更大的元素。

代码实现

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) { 
         stack<int> st;
         st.push(0);
         vector<int> nums1(nums.begin(),nums.end());
         nums.insert(nums.end(),nums1.begin(),nums1.end());
         vector<int> vec(nums.size(),-1);
             for (int i = 1; i < nums.size(); i++) {
             while(!st.empty()&&nums[i]>nums[st.top()]){
                vec[st.top()]=nums[i];
                st.pop();
                }
                st.push(i);
        }
        vec.resize(nums.size()/2);
        return vec;
    }
};
posted on 2025-12-23 12:42  FAfa_C++  阅读(3)  评论(0)    收藏  举报