【力扣】496. 下一个更大元素 I <单调栈、模拟>

【力扣】496. 下一个更大元素 I

  nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个没有重复元素的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
  对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
  返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
  • 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
  • 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

示例 2:
输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
  • 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

提示:
1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1 0 4 10^4 104
nums1和nums2中所有整数 互不相同
nums1 中的所有整数同样出现在 nums2 中

题解

单调栈+哈希

import java.util.*;

public class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        //单调栈
        Stack<Integer> stack = new Stack<>();

        //存放结果最终结果,大小和nums1一样
        int[] result = new int[nums1.length];
        Arrays.fill(result, -1);


        //求nums1和nums2的映射关系
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            // key为数值,value为下标
            map.put(nums1[i], i);
        }

        //先放第一个元素的下标进单调栈
        stack.add(0);
        //单调栈遍历数组nums2
        for (int i = 1; i < nums2.length; i++) {
            //当前遍历的元素和栈口元素的比较
            if (nums2[i] <= nums2[stack.peek()]) {
                stack.push(i);
            }
            else {
                //循环比较
                while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) {
                    if (map.containsKey(nums2[stack.peek()])) {
                        Integer index = map.get(nums2[stack.peek()]);
                        result[index] = nums2[i];
                    }
                    stack.pop();
                }
                stack.push(i);
            }
        }
        return result;
    }
}

【力扣】496. 下一个更大元素 I <单调栈、模拟>_第1张图片
暴力:

public class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {

        int[] result = new int[nums1.length];

        //遍历nums1的元素,逐个去nums2找
        for (int i = 0; i < nums1.length; ++i) {
            
            //先找到相等的位置
            int j = 0;
            while (j < nums2.length && nums2[j] != nums1[i]) {
                j++;
            }

            //继续找右边第一个比它大的
            int k = j + 1;
            while (k < nums2.length && nums2[k] < nums2[j]) {
                k++;
            }

            //k < nums2.length说明找到了右边比它大的
            result[i] = (k < nums2.length) ? nums2[k] : -1;
        }
        return result;
    }
}

你可能感兴趣的:(力扣及OJ,#,栈,队列,单调栈,#,模拟,leetcode,java,算法)