Leetcode No.496 下一个更大元素I

题目大意

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 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。

注意

  1. nums1和nums2中所有元素是唯一的。
  2. nums1和nums2 的数组大小都不超过1000。

代码一

暴力法,写一个indexOf方法,找nums1[i]在nums2中的哪个下标位置。

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        if(nums1.length > nums2.length) return new int[]{};
         int[] res = new int[nums1.length];
         for(int i = 0;i nums1[i]) {
                    res[i] = nums2[j];
                    break;
                }
         }
         return res;
    }
    
    private int findIndexOf(int target, int[] nums) {
        //在nums中找target的下标
        for(int i=0;i

运行时间2ms,击败98.43%。

代码二

利用栈存储每个nums2[i]的下一个大元素。

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        if(nums1.length ==0 || nums1.length > nums2.length) return new int[]{}; 
        Stack stack = new Stack<>();  // nums2[i]
        Map map = new HashMap<>();  //nums2[i]:nums2[j]
        int[] res = new int[nums1.length];

        int k = 0;
        stack.push(nums2[k++]);
        while(k tmp) {
                    map.put(tmp,nums2[k]);
                    stack.pop();
                } else {
                    stack.push(nums2[k++]);
                }
            }   
        }

        for(int i=0;i

运行时间5ms,击败69.71%。

你可能感兴趣的:(Leetcode No.496 下一个更大元素I)