一、题目要求:
给出两个int数组nums1和nums2,nums1是nums2的子集, 从nums2中找到nums1中每个元素之后大于他的第一个元素位置。
二、解决方法
方法一:栈
思路分析:
1. findNums是nums的子集,所以可以将nums中的每一个元素都在nums中找到next greater element,加入到map中存放
2. 再遍历findNums中每个元素,从map中对照取出所需。
步骤:
1. for循环nums中每一个元素nums[i],如果栈中有元素且栈顶元素小于nums[i],那么该元素是栈顶的next greater element(否则的话栈顶元素早已出栈),出栈栈中所有小于nums[i]的元素,他们的next greater element都是nums[i],将其加入map
2.for循环findNums中每一个元素,从map中按需取出,若无输出-1
实现:
· public int[] nextGreaterElement(int[] findNums, int[] nums) {
Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
Stack<Integer> stack = new Stack<>();
for (int num : nums) {
while (!stack.isEmpty() && stack.peek() < num)
map.put(stack.pop(), num);
stack.push(num);
}
for (int i = 0; i < findNums.length; i++)
findNums[i] = map.getOrDefault(findNums[i], -1);
return findNums;
}
技巧:
1. 定义了一个HashMap,存储每个元素key对应的next greater element(value)
2. map的函数:map.getOrDefault(key,default):在map中查找key对应的value,如果找不到该key那么输出指定的default值
3. 定义的stack中元素保持递减