方法一:暴力破解
三层循环遍历
①第一层遍历nums1,获取当前元素e
②第二层遍历num2,找到当前元素e在num2中的位置index
③第三层,从index开始遍历num2,找到第一个大于e的元素
方法二:栈+哈希表
第 1 个子问题:如何更高效地计算nums 2中每个元素右边的第一个更大的值;
第 2 个子问题:如何存储第 1 个子问题的结果。
1.栈:用栈来排查当前元素右侧第一个最大元素
①倒序遍历num2数组元素{
②判断栈是否为空,为空则表示当前元素右侧没有比它大的值,直接map记录当前元素右侧第一个最大元素为-1,并将当前元素入栈。
③如果栈不为空,并且当前元素大于栈顶元素,则表示栈顶元素不是当前元素右侧第一个最大值,此时将栈顶元素弹出,若当前元素仍然大于新的栈顶元素,继续弹出,直到当前元素小于新的栈顶元素,表示此时的栈顶元素就是当前元素右侧第一个最大元素(栈中存储数据从栈顶开始升序的)将当前元素入栈,并将当前元素与栈顶元素记录在map中,如果当前元素一直>新的栈顶元素,直到栈元素都弹空了,说明当前元素右侧没有比它大的值。
}
2.哈希表:用来记录当前元素与其右侧第一个最大元素的映射
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
int len1=nums1.length;
int len2=nums2.length;
int[] ans=new int[len1];
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
if(nums1[i]==nums2[j]){
for(int k=j;k<len2;k++){
if(nums2[k]>nums1[i]){
ans[i]=nums2[k];
break;
}else{
ans[i]=-1;
}
}
break;
}
}
}
return ans;
}
}
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Deque<Integer> stack = new ArrayDeque<Integer>();
//从后开始遍历num2数组
for (int i = nums2.length - 1; i >= 0; --i) {
int num = nums2[i];
//找到当前元素右侧第一个最大值
//栈不为空,且当前元素大于栈顶元素,则弹出栈顶元素,最后栈为空表示当前元素右侧没有比它大的值
while (!stack.isEmpty() && num >= stack.peek()) {
stack.pop();
}
//map记录每个元素与其右侧第一个最大值之间的映射,栈为空,则没有比它大的值
map.put(num, stack.isEmpty() ? -1 : stack.peek());
stack.push(num);
}
int[] res = new int[nums1.length];
//从map中取出指定元素的右侧第一个最大值
for (int i = 0; i < nums1.length; ++i) {
res[i] = map.get(nums1[i]);
}
return res;
}
}