0496.下一个更大的元素I
描述
给定两个没有重复元素的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 nums1
中每个元素在 nums2
中的下一个比其大的值。
nums1
中数字 x 的下一个更大元素是指 x 在 nums2
中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
实例
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
注意
nums1
和nums2
中所有元素是唯一的。nums1
和nums2
的数组大小都不超过1000。
题解
- 对于
num2
中所有的元素都找到一个对应的下一个更大元素
(成对,使用HashMap
存储 - 使用
stack
- 遍历
num2
- 栈空时直接入栈(只会出现在第一个元素中
- 栈不空时,将当前元素
i
与栈顶元素比较,- 若当前元素大则说明该元素是栈顶元素的
下一个更大元素
,出栈并将这一对数存入HashMap
- 所当前元素小则将该元素入栈
- 若当前元素大则说明该元素是栈顶元素的
- 遍历
- 遍历
num1
每个元素从HashMap
中找到对应值,没有则说明应该输出为-1
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> stateMap = new HashMap<>();
Stack<Integer> stack = new Stack<>();
int[] result = new int[nums1.length];
if (result.length == 0)
return result;
for (int i:nums2){
while (!stack.empty()){
if (i > stack.peek()){
stateMap.put(stack.pop(),i);
} else {
break;
}
}
stack.push(i);
}
for (int i = 0; i < nums1.length; i++) {
result[i] = stateMap.containsKey(nums1[i]) ? stateMap.get(nums1[i]) : -1;
}
return result;
}