(两百二十四) leetcode 下一个更大元素 I

1.题目

给定两个没有重复元素的数组 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。
注意:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

2.思路

思路限定在栈,新建一个栈用于存储nums2数组,然后遍历nums1,对应每个nums1的元素nums2出栈,比较元素大小,若nums2出栈元素比nums1大,则记录下来,并设置一个flag表示找到比nums1大的元素;若如果元素两者相等,则停止比较记录,若flag为true表明有比nums1大的,存在另外一个数组里,否则存-1;之后将nums2出栈的每个元素再还原回来。

 

3.coding

3.1 初步方案

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Stack<Integer> stack1 = new Stack();
        Stack<Integer> stack2 = new Stack();
        int[] result = new int[nums1.length];
        for (int i : nums2) {
            stack1.push(i);
        }

        for (int i = 0; i < nums1.length; i++) {
            boolean flag = false;
            int value = Integer.MIN_VALUE;
            while (!stack1.isEmpty()) {
                int j = stack1.pop();
                stack2.push(j);
                if (j == nums1[i]) {
                    break;
                } else if (j > nums1[i]) {
                    flag = true;
                    value = j;
                }
            }
            result[i] = flag ? value : -1;
            while (!stack2.isEmpty()) {
                stack1.push(stack2.pop());
            }
        }

        return result;
    }
}

执行结果:

通过

显示详情

执行用时 :148 ms, 在所有 Java 提交中击败了5.58%的用户

内存消耗 :40.4 MB, 在所有 Java 提交中击败了5.32%的用户

 

3.2 优化-hashmap

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int result[] = new int[nums1.length];
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        for(int i = 0; i < nums2.length; i++){
            hashMap.put(nums2[i],-1);
            for (int j = i + 1; j < nums2.length; j++){
                if(nums2[j] > nums2[i]){
                    hashMap.put(nums2[i],nums2[j]);
                    break;
                }
            }
        }

        for(int i = 0; i < nums1.length ; i++){
            result[i] = hashMap.get(nums1[i]);
        }
        return result;
    }
}

先将num2里各个元素右边的比它大的数用hashmap记录下来,然后nums1直接以key获取即可

 

3.3 优化-hashmap+stack

public class Solution {
    public int[] nextGreaterElement(int[] findNums, int[] nums) {
        Stack < Integer > stack = new Stack < > ();
        HashMap < Integer, Integer > map = new HashMap < > ();
        int[] res = new int[findNums.length];
        for (int i = 0; i < nums.length; i++) {
            while (!stack.empty() && nums[i] > stack.peek())
                map.put(stack.pop(), nums[i]);
            stack.push(nums[i]);
        }
        while (!stack.empty())
            map.put(stack.pop(), -1);
        for (int i = 0; i < findNums.length; i++) {
            res[i] = map.get(findNums[i]);
        }
        return res;
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/next-greater-element-i/solution/xia-yi-ge-geng-da-yuan-su-i-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

自己理解了下写了下

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int result[] = new int[nums1.length];
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        Stack<Integer> stack = new Stack();
        for (int i = 0; i < nums2.length; i++) {
            while (!stack.isEmpty() && nums2[i] > stack.peek()) {
                hashMap.put(stack.pop(), nums2[i]);
            }
            stack.push(nums2[i]);
        }
        while (!stack.isEmpty()) {
            hashMap.put(stack.pop(), -1);
        }

        for (int i = 0; i < nums1.length; i++) {
            result[i] = hashMap.get(nums1[i]);
        }
        return result;
    }
}

这个很巧妙,相当于是堆栈大的就出栈,小的就入栈,最后栈剩下来的肯定是单调递减的,然后都是-1,时间复杂度是nums1和nums2的个数和,时间复杂度看最内层的执行次数,stack.pop最多执行nums2的个数次。

 

相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页