LeetCode刷题之更加大的结点

283 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

给你两个 没有重复元素 的数组 nums1nums2 ,其中nums1nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 xnums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1

示例1 :

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
    对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
    对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
    对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

示例2 :

输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
    对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
    对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

思路:哈希表 + 暴力

  • 用哈希表保存nums2数组的索引
  • 遍历nums1,通过哈希表找到当前元素在nums2数组的索引,然后从索引开始往后遍历nums2找到第一个更大的数。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    //map中的key是数组中元素的值,value是这个值遇到的
    //右边第一个比他大的值
    Map<Integer, Integer> map = new HashMap<>();
    //单调栈,从栈顶到栈底是递增的
    Stack<Integer> stack = new Stack<>();
    //遍历nums2的所有元素
    for (int num : nums2) {
        //如果栈顶元素小于num,说明栈顶元素遇到了右边
        //第一个比他大的值,然后栈顶元素出栈,记录下
        //这个值。
        while (!stack.empty() && stack.peek() < num)
            map.put(stack.pop(), num);
        //当前元素入栈
        stack.push(num);
    }
    //遍历nums1的所有元素,然后在map中查找,如果没有查找到,
    //说明没有遇到右边比他大的值,默认给-1。
    int[] res = new int[nums1.length];
    for (int i = 0; i < nums1.length; i++) {
        res[i] = map.getOrDefault(nums1[i], -1);
    }
    return res;
}

思路2:单调栈 + 哈希表

  • 使用数组+头指针模拟栈能大大提高运行的速度。
  • 遍历nums2,比较当前元素和栈顶元素的大小,如果栈顶较小则出栈,出栈的元素的下一个更大的数就是当前元素。
class Solution {
   public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums2.length;i++)
           {
               for(int j=i+1;j<nums2.length;j++)
               {
                   if(nums2[j]>nums2[i]) {
                       map.put(nums2[i], nums2[j]);
                     break;
                   }
               }

           }
        for (int i=0;i<nums1.length;i++)
        {
            if(map.containsKey(nums1[i]))
            {
                nums1[i]=map.get(nums1[i]);
                
            }else
                nums1[i]=-1;
      

        }
        return nums1;
    }
}