zoukankan      html  css  js  c++  java
  • [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 题目汇总

  • 相关阅读:
    HBuilder在线打包ipa步骤
    SWD烧录/仿真方式
    详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]
    Centos/Linux下调整分区大小(以home和根分区为例)
    Centos6.5安装中文支持和中文输入法
    如何用电路实现检测过零点?这个简单电路就能搞定
    ifconfig无输出的原因及解决办法
    Linux云服务器下Tomcat部署
    linux wget 命令用法详解(附实例说明)
    yum的repo文件详解、以及epel简介、yum源的更换
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9847760.html
Copyright © 2011-2022 走看看