随想录训练营50/60 | LC 739. 每日温度;LC 496.下一个更大元素 I

LC 739. 每日温度

题目链接LC 739. 每日温度
思路:不是按着顺序去得到每天之后的更高温度,而是通过栈将未能得到更高温度的天保存下来,然后向后遍历,每次遍历的元素要和栈顶元素比较若遍历的元素温度高就移除栈顶元素,并且将栈顶元素对应的结果保存下来,直到栈顶元素的值比遍历的值大,再将遍历的值放入栈中。其中栈中的元素从栈底到栈顶始终保持递减的顺序。
代码

class Solution {
public:
    //暴力解法,会超时
    // vector<int> dailyTemperatures(vector<int>& temperatures) {
    //     vector<int> result;
    //     for(int i=0; i<temperatures.size()-1;i++){
    //         int flag = 0;
    //         for(int j=i+1; j<temperatures.size(); j++){
    //             if(temperatures[i]<temperatures[j]){
    //                 result.push_back(j-i);
    //                 flag = 1;
    //                 break;
    //             }
    //         }
    //         if(flag == 0)result.push_back(0);
    //     }
    //     result.push_back(0);
    //     return result;
    // }
    //单调栈解法
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> result(temperatures.size(), 0);
        stack<int> st;//栈中存放的是数组下标
        st.push(0);
        for(int i=1;i<temperatures.size(); i++){
            if(temperatures[i]<=temperatures[st.top()]){
                st.push(i);
            }
            else{
                while(!st.empty() && temperatures[i]>temperatures[st.top()]){
                    result[st.top()] = i-st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

LC 496.下一个更大元素 I

题目链接LC 496.下一个更大元素 I
思路:首先要找到nums1元素与nums2元素对应的位置。本质上还是找nums2中每个元素的下一个更大元素,不过只保存nums1中元素,并且保存的顺序也按nums1来。那么可以给nums1设定map,每次nums2找到下一个更大元素的时候,就看nums1是否有该元素,若有该元素就保存结果。
代码

class Solution {
public:
    //暴力解法 ,可以运行,耗时多,内存消耗少 
    // vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
    //     vector<int> result(nums1.size(), -1);
    //     for(int i=0; i<nums1.size(); i++){
    //         for(int j=0; j<nums2.size(); j++){
    //             if(nums1[i]==nums2[j]){
    //                 int cur = j+1;
    //                 while(cur<nums2.size()){
    //                     if(nums2[j]<nums2[cur]){
    //                         result[i] = nums2[cur];
    //                         break;
    //                     }
    //                     cur++;
    //                 }
    //             }
    //         }
    //     }
    //     return result;
    // }
    //单调栈解法
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        //首先需要知道nums1中的每个元素在nums2的位置,使用map
        unordered_map<int, int> map;
        for(int i=0; i<nums1.size(); i++){//先遍历nums1,可以通过值得到该值的位置
            map[nums1[i]] = i;
        }
        vector<int> result(nums1.size(), -1);
        stack<int> st;
        st.push(0);//这个0表示的也是下标
        for(int i=1; i<nums2.size(); i++){
            if(nums2[i]<=nums2[st.top()]){
                st.push(i);
            }
            else{
                while(!st.empty() && nums2[i]>nums2[st.top()]){
                    if(map.find(nums2[st.top()])!=map.end()){
                        result[map[nums2[st.top()]]] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值