zoukankan      html  css  js  c++  java
  • LeetCode——每日温度

    Q:根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
    例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
    提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

    A:单调栈

        public static int[] dailyTemperatures(int[] T) {
            int n = T.length;
            int[] result = new int[n];
            Arrays.fill(result, 0);//初始化
            if (n <= 1)
                return result;
            Stack<Integer> s = new Stack<>();
            s.push(n - 1);
            for (int i = n - 2; i >= 0; i--) {
                while (!s.empty() && T[s.peek()] <= T[i])
                    s.pop();//比当前小的都弹出来
                if (!s.empty())
                    result[i] = s.peek() - i;
                s.push(i);//当前压入
            }
            return result;
        }
    

    如果是循环的,连长一倍即可。

    Q:给你⼀个数组,返回⼀个等⻓的数组,对应索引存储着下⼀个更⼤元素。拥有了环形属性,最后⼀个元素 3 绕了⼀圈后找到了⽐⾃⼰⼤的元素 4 。
    举例:给你⼀个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,4]。
    A:

    回到 Next Greater Number 的问题,增加了环形属性后,问题的难点在于:这个 Next 的意义不仅仅是当前元素的右边了,有可能出现在当前元素的左边(如上例)。
    明确问题,问题就已经解决了⼀半了。我们可以考虑这样的思路:将原始数组“翻倍”,就是在后⾯再接⼀个原始数组,这样的话,按照之前的流程,每个元素不仅可以⽐较⾃⼰右边的元素,⽽且也可以和左边的元素⽐较了。

    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> res(n); // 存放结果
        stack<int> s;
        // 假装这个数组⻓度翻倍了
        for (int i = 2 * n - 1; i >= 0; i--) {
            while (!s.empty() && s.top() <= nums[i % n])
                s.pop();
            res[i % n] = s.empty() ? -1 : s.top();
            s.push(nums[i % n]);
            }
            return res;
        }
    
  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/xym4869/p/12619705.html
Copyright © 2011-2022 走看看