496. 下一个更大元素 I
问题描述:
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
解决方案(参考自三叶小姐姐)
1.暴力搜索
解题思路:先找到nums2数组中跟nums1该元素相等元素的下标
从该元素向后搜索直到找到比该元素大的数,找不到即返回-1
代码实现(Java):
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int n =nums1.length;
int m = nums2.length;
int []result = new int[n];
for(int i=0;i<n;i++){
// 寻找该元素的下标
int j=0;
while (j<m && nums1[i]!=nums2[j]) j++;
// 找到后寻找比该元素大的数
while (j<m && nums2[j]<=nums1[i]) j++;
result[i] =j<m? nums2[j] :-1;
}
return result;
}
}
2.单调栈+哈希映射
解题思路:构造一个单调栈,通过哈希映射存入哈希表
如果栈顶为空说明无所找元素,反之栈顶元素即为所求元素
代码实现:
public int[] nextGreaterElement2(int[] nums1, int[] nums2) {
int n = nums1.length;
int m = nums2.length;
Deque<Integer> d = new ArrayDeque<>();
Map<Integer, Integer> map = new HashMap<>();
// 逆序遍历数组二构造单调栈 ???此处不明白为何逆序
for (int i = m - 1; i >= 0; i--) {
int x = nums2[i];
// 构造单调递减栈 栈顶不为空,且栈顶元素小于当前元素时出栈
while (!d.isEmpty() && d.peekLast() <= x) d.pollLast();
map.put(x, d.isEmpty() ? -1 : d.peekLast());
d.addLast(x);
}
// 构造解向量
int[] result = new int[n];
for (int i = 0; i < n; i++) {
result[i] = map.get(nums1[i]);
}
return result;
}

浙公网安备 33010602011771号