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;
}
 

 

 

posted @ 2021-10-27 21:46  夜未央111  阅读(32)  评论(0)    收藏  举报