Question 1 Next Greater Element I
Method 1: Brute Force O(n^2)
Step 1: 在 nums2里找到和这个数
Step 2: 往右看,找第一个比我大的
Method 2: Optimization
Analysis
用单调栈撸一遍,是撸nums1还是撸nums2?只能撸nums2
就算用单调栈撸一遍nums2了以后,只能知道,nums2里每个元素对应右边第一个比他大的是谁
nums2 = [1,3,4,2], result[3,4,-1,-1]
问题在于对不上元素,虽然知道了nums2里面每个元素的结果,但是不不知道nums1里每一个元素在nums2里的位置
Map<Key: nums, Value: 这个元素在nums2 index> map
Details
Step 1: 确认Use Case of Mono -Stack
Step 2: 用的是什么栈:动手过个例子(2元素就够了)
Step 3: 栈里存的是什么物理意义
Follow Up
nums2.length >>>> nums1.length
Map------Key:每个nums2的元素,Value:右边第一个比他大的结果
如果记录的是index,每个人必然有index, O(n)开定了
如果记录的是result,每个人右边可能没有比他大的人,不一定
// Some code
public int[] nextGreatElement(int[] nums1, int[] nums2) {
Map<Integer, Integer> resultMap = new HashMap<>();
int[] result = new int[num1.length];
Deque<Integer> monoStack = new ArrayDeque<>();
for (int i = 0; i < nums2.length; i++) {
while (!monoStack.isEmpty() && monoStack.peekLast() < nums2[i]) {
resultMap.put(monoStack.pollLast(), nums2[2]); // monoStack存的是nums2的element
}
monoStack.offerLast(nums2[i]);
}
for (int i = 0; i < nums1.length; i++) {
result[i] = resultMap.getOrDefault(nums1[i], -1);
}
return result;
}
Last updated