给定两个没有重复元素的数组 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。
思路:
- 两个数组都是无序的,其中数组1 是数组2 的子集。那么可以先 遍历数组2 获取数组2中每一个元素,与比该元素大的元素的hash表,
- 然后遍历整个数组1 .在hash表中获取,存在就返回,不存在,就返回-1
难点:
- 使用栈,遍历数组2,第一个元素放进去,如果接下来的元素比第一个元素大,就直接放入Hash表中,其中大的元素作为value。小的元素作为key
- 接下来遍历,如果第二个元素小,那么就继续放入,直到出现比栈顶元素大的数据,那么就栈顶元素出栈,栈顶元素作为key 要入栈元素作为value
- 遍历数组2完毕,接下来,遍历数组1 ,从hash表中去取。存在,就返回value,不存在,就返回-1.
代码:
Stack<Integer> stack = new Stack<Integer>();
HashMap<Integer, Integer> hasMap = new HashMap<Integer, Integer>();
int[] result = new int[nums1.length];
// 遍历数组2.栈顶元素小于,就出栈,作为key,比它大的就作为value
for(int num : nums2) {
while(!stack.isEmpty() && stack.peek()<num){
hasMap.put(stack.pop(), num);
}
stack.push(num);
}
for(int i = 0; i < nums1.length; i++) result[i] = hasMap.getOrDefault(nums1[i], -1);
return result;
网友评论