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


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


    739.每日温度

    题目链接:739. 每日温度 - 力扣(LeetCode)

    题目描述:

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

    示例 1:

    输入: temperatures = [73,74,75,71,69,72,76,73]
    输出: [1,1,4,2,1,1,0,0]
    
    • 1
    • 2

    示例 2:

    输入: temperatures = [30,40,50,60]
    输出: [1,1,1,0]
    
    • 1
    • 2

    示例 3:

    输入: temperatures = [30,60,90]
    输出: [1,1,0]
    
    • 1
    • 2

    提示:

    • 1 <= temperatures.length <= 105
    • 30 <= temperatures[i] <= 100
    class Solution {
    public:
        std::vector<int> dailyTemperatures(std::vector<int>& temperatures) {
            std::stack<int> stack;
            int lens = temperatures.size();
            std::vector<int> arr(lens);
            int i = lens-1;
            while(i>=0){
                if(stack.empty()){
                    stack.push(i);
                    arr[i] = 0;
                }else{
                    while(!stack.empty() && temperatures[i]>=temperatures[stack.top()]){
                        stack.pop();
                    }
                    if(stack.empty()){
                        stack.push(i);
                        arr[i] = 0;
                    }else if(temperatures[i]<temperatures[stack.top()]){
                        arr[i] = stack.top()-i;
                        stack.push(i);
                    }
                }
                i--;
            }
            return arr;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    496.下一个更大元素 I

    题目链接:496. 下一个更大元素 I - 力扣(LeetCode)

    题目描述:

    nums1 中数字 x下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。

    给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中nums1nums2 的子集。

    对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j]下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1

    返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素

    示例 1:

    输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
    输出:[-1,3,-1]
    解释:nums1 中每个值的下一个更大元素如下所述:
    - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
    - 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
    - 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    示例 2:

    输入:nums1 = [2,4], nums2 = [1,2,3,4].
    输出:[3,-1]
    解释:nums1 中每个值的下一个更大元素如下所述:
    - 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
    - 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    提示:

    • 1 <= nums1.length <= nums2.length <= 1000
    • 0 <= nums1[i], nums2[i] <= 104
    • nums1nums2中所有整数 互不相同
    • nums1 中的所有整数同样出现在 nums2

    **进阶:**你可以设计一个时间复杂度O(nums1.length + nums2.length) 的解决方案吗?

    暴力:

    class Solution {
    public:
        std::vector<int> nextGreaterElement(std::vector<int>& nums1, std::vector<int>& nums2) {
            std::vector<int> arr(nums1.size(),-1);
            for(int i = 0;i<nums1.size();i++){
                int k = 0;
                while(nums2[k]!=nums1[i]) k++;
                for(;k<nums2.size();k++){
                    if(nums2[k]>nums1[i]) {
                        arr[i] = nums2[k];
                        break;
                    }
                }
            }
            return arr;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    单调栈

    class Solution {
    public:
        std::vector<int> nextGreaterElement(std::vector<int>& nums1, std::vector<int>& nums2) {
            std::stack<int> stack;// 存放索引
            std::vector<int> arr(nums1.size(),-1);  // 存放答案
            std::unordered_map<int,int> map;    // 快速查找 nums1 中是否出现此数
    
            for(int i = 0;i<nums1.size();i++) map[nums1[i]] = i;
    
            stack.push(0);
            for(int i = 1;i<nums2.size();i++){
                if(nums2[i]<=nums2[stack.top()]){
                    stack.push(i);
                }else{
                    while(!stack.empty() && nums2[i]>nums2[stack.top()]){
                        if(map.count(nums2[stack.top()])){
                            arr[map[nums2[stack.top()]]] = nums2[i];
                        }
                        stack.pop();
                    }
                    stack.push(i);
                }
            }
            return arr;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Jmeter 多实例压测
    如何对wps流程图进行重命名,如何对wps流程图进行重命名,wps进入修订模式,wps怎么在尾部加公式标号英文论文格式要求及字体大小
    【疑难攻关】——文件包含漏洞
    Springboot简单功能示例-6 使用加密数据源并配置日志
    【AI设计模式】01-数据表示-特征哈希(Feature Hashed)模式
    jasypt 配置文件加解密
    《Java Web程序设计——开发环境搭建》
    前后端分离不可忽视的陷阱,深入剖析挑战,分享解决方案,助你顺利实施分离开发。
    SpingMVC请求和响应
    【python游戏制作】僵尸来袭 ~ 快来一起创造植物叭~
  • 原文地址:https://blog.csdn.net/qq_33909269/article/details/133959029