题目
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
思路
没有重复元素的数组,并且num1是nums2的子集。那么只要找出nums2的每个数的下一个更大的元素,nums1自然就能够得到结果了!
利用一个单调栈,如果当前数值是小于栈顶的数值,那么就将栈顶数值给记下来【这里可以利用一个哈希表】,如果当前数值大于栈顶的数值,那么就将栈顶的数值剔除掉,直到栈为空或者栈顶数值小于当前数值。然后将其存放进哈希表后,当前数值必须要压入栈中【因为可能是前面数值的下一个更大元素】!
代码
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
* 下一个更大的元素
*/
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Deque<Integer> deque = new LinkedList<>();
Map<Integer,Integer> map = new HashMap<>();
int length = nums2.length;
for (int i=length-1;i>=0;--i)
{
int temp = nums2[i];
// 只要当前栈不为空 且 栈顶数值必须大于当前数值
while (!deque.isEmpty() && deque.peek()<temp)
deque.pop(); // 否则弹出栈顶元素
// 找到当前元素的下一个更大元素后,将其记录在哈希表里面
map.put(temp,deque.isEmpty()?-1:deque.peek());
// 将当前数值压入栈中,因为当前数值可能是前面数值的下一个更大的数
deque.push(temp);
}
int len = nums1.length;
int ans[] =new int[len];
// 从哈希表中取出结果即可
for (int i=0;i<len;++i)
ans[i]=map.get(nums1[i]);
return ans;
}
}
结果
本来已经将单调栈忘得七七八八了,又开始回忆起来这个东西了!