题目:496. 下一个更大元素 I
方法1 stack+map
1、思路:
- stack:如何更高效地计算 nums2[ ] 中每个元素右边的第一个更大的值
- map:如何存储问题的结果
2、算法
(1) 循环遍历nums2
- 将元素值nums2[i]与其右边第一个更大的元素值的对应关系存入哈希表,将nums2[i]作为键,右边第一个更大的元素作为值
- 用单调栈中维护当前位置右边的更大的元素列表,从栈底到栈顶的元素是单调递减的。当前位置右边的第一个更大的元素即为栈顶元素,如果栈为空则说明当前位置右边没有更大的元素。随后我们将位置 i 的元素入栈。
(2) 循环遍历nums1[], 从map中获取结果
3、java代码
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Stack<Integer> stack = new Stack<>();
//循环遍历nums2
//将元素值nums2[i]与其右边第一个更大的元素值的对应关系存入哈希表
//将nums2[i]作为键,右边第一个更大的元素作为值
for(int i=nums2.length-1;i>=0 ;i--){
//如果栈空:nums[i]入栈,(nums[i],-1)存入map
//如果栈不空:判断nums[i]与stack.peek的大小
//如果nums[i]<stack.peek():(nums[i], stack.peek())存入map
//如果nums[i]>stack.peek():stack.pop(), nums[i]入栈, (nums[i],stack.peek())存入map
//融合了对nums[i]与stack.peek的大小比较结果处理的两种方式
while (!stack.isEmpty() && nums2[i]>stack.peek()){ //临界:当stack空时停止pop()
stack.pop();
}
//使用条件运算符判断:融合了对栈是否为空处理的两种方式
map.put(nums2[i], stack.isEmpty() ? -1 : stack.peek());
stack.push(nums2[i]);
}
//循环遍历nums1[], 从map中获取结果
int[] arr =new int[nums1.length];
for(int i=0;i< nums1.length;i++){
arr[i]= map.get(nums1[i]);
}
return arr;
}
}