1.题目描述:
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]是如上所述的下一个更大元素。
2.暴力解法:很容易想到。
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] arr = new int[nums1.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
for (int i = 0; i < nums1.length; i++) {
int index = 0;
for (int j = 0; j < nums2.length; j++) {
if (nums1[i] == nums2[j]) {
index = j;
break;
}
}
for (int k = index + 1; k < nums2.length; k++) {
if (nums2[k] > nums1[i]) {
arr[i] = nums2[k];
break;
}
}
}
return arr;
}
}
用哈希表优化一下:
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] arr = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
map.put(nums1[i], i);
}
for (int i = 0; i < nums2.length; i++) {
if (map.containsKey(nums2[i])) {
for (int j = i + 1; j < nums2.length; j++) {
if (nums2[j] > nums2[i]) {
arr[map.get(nums2[i])] = nums2[j];
break;
}
}
}
}
return arr;
}
}
3.单调栈:
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int[] arr = new int[nums1.length];
Map<Integer, Integer> map = new HashMap<>();
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
map.put(nums1[i], i);
}
for (int i = 0; i < nums2.length; i++) {
while (!stack.isEmpty() && nums2[stack.peek()] < nums2[i]) {
if (map.containsKey(nums2[stack.peek()])){
Integer index = map.get(nums2[stack.peek()]);
arr[index] = nums2[i];
}
stack.pop();
}
stack.push(i);
}
return arr;
}
}