【力扣】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;
}
}
暴力:
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;
}
}