• [LeetCode] 496. Next Greater Element I 下一个较大的元素 I


    You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of nums2. Find all the next greater numbers for nums1's elements in the corresponding places of nums2.

    The Next Greater Number of a number x in nums1 is the first greater number to its right in nums2. If it does not exist, output -1 for this number.

    Example 1:

    Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
    Output: [-1,3,-1]
    Explanation:
        For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
        For number 1 in the first array, the next greater number for it in the second array is 3.
        For number 2 in the first array, there is no next greater number for it in the second array, so output -1. 

    Example 2:

    Input: nums1 = [2,4], nums2 = [1,2,3,4].
    Output: [3,-1]
    Explanation:
        For number 2 in the first array, the next greater number for it in the second array is 3.
        For number 4 in the first array, there is no next greater number for it in the second array, so output -1.

    Note:

    1. All elements in nums1 and nums2 are unique.
    2. The length of both nums1 and nums2 would not exceed 1000.

    给2个没有重复元素的数组nums1, nums2,nums1的元素是由nums2的子集组成,求nums1中每个数字在nums2右边第一个较大的数字,如果不存在则为-1。返回所找到的结果组成的数组。

    Key observation:
    Suppose we have a decreasing sequence followed by a greater number
    For example [5, 4, 3, 2, 1, 6] then the greater number 6 is the next greater element for all previous numbers in the sequence

    We use a stack to keep a decreasing sub-sequence, whenever we see a number x greater than stack.peek() we pop all elements less than x and for all the popped ones, their next greater element is x
    For example [9, 8, 7, 3, 2, 1, 6]
    The stack will first contain [9, 8, 7, 3, 2, 1] and then we see 6 which is greater than 1 so we pop 1 2 3 whose next greater element should be 6

    解法:栈,递减栈。先求出nums2中所有元素的右边第一个较大数字的位置,并记录到map中。然后,因为nums1是子数组,循环nums1中的元素,记录在map中值并返回。求nums2中下一个较大元素时用递减栈,循环元素,当前元素大于栈顶元素时,就弹出栈顶元素,并记录栈顶元素下一个最大就是当前元素。然后继续比较栈顶元素,直到小于或等于栈顶元素。

    G家followup: 如果data是stream data怎么改代码和设计输出。

    Java:

     public int[] nextGreaterElement(int[] findNums, int[] nums) {
            Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
            Stack<Integer> stack = new Stack<>();
            for (int num : nums) {
                while (!stack.isEmpty() && stack.peek() < num)
                    map.put(stack.pop(), num);
                stack.push(num);
            }   
            for (int i = 0; i < findNums.length; i++)
                findNums[i] = map.getOrDefault(findNums[i], -1);
            return findNums;
        }
    

    Python:

    class Solution(object):
        def nextGreaterElement(self, findNums, nums):
            """
            :type findNums: List[int]
            :type nums: List[int]
            :rtype: List[int]
            """
            d = {}
            st = []
            ans = []
            
            for x in nums:
                while len(st) and st[-1] < x:
                    d[st.pop()] = x
                st.append(x)
    
            for x in findNums:
                ans.append(d.get(x, -1))
                
            return ans
    

    Python: wo

    class Solution(object):
        def nextGreaterElement(self, findNums, nums):
            """
            :type findNums: List[int]
            :type nums: List[int]
            :rtype: List[int]
            """
            if not findNums or not nums:
                return []
            
            m = {}
            for i in range(len(nums) - 1):
                for j in range(i + 1, len(nums)):
                    if nums[j] > nums[i]:
                        m[nums[i]] = nums[j]
                        break
                if not m.get(nums[i], 0):
                    m[nums[i]] = -1
          
            m[nums[-1]] = -1
            
            res = []
            for num in findNums:
                res.append(m[num])
                
            return res    

    C++:  

    class Solution {
    public:
        vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
            stack<int> s;
            unordered_map<int, int> m;
            for (int n : nums) {
                while (s.size() && s.top() < n) {
                    m[s.top()] = n;
                    s.pop();
                }
                s.push(n);
            }
            vector<int> ans;
            for (int n : findNums) ans.push_back(m.count(n) ? m[n] : -1);
            return ans;
        }
    };
    

      

    类似题目:

    [LeetCode] 503. Next Greater Element II 下一个较大的元素 II

    [LeetCode] 556. Next Greater Element III 下一个较大的元素 III

    [LeetCode] 739. Daily Temperatures 每日温度

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9847760.html
Copyright © 2020-2023  润新知