496J. Next Greater Element I
https://leetcode.com/problems/next-greater-element-i/
本题是 monotonous stack 的经典 以下为摘抄:
单调递增栈可以找到左起第一个比当前数字小的元素。比如数组 [2 1 4 6 5],刚开始2入栈,数字1入栈的时候,发现栈顶元素2比较大,将2移出栈,此时1入栈。那么2和1都没左起比自身小的数字。然后数字4入栈的时候,栈顶元素1小于4,于是1就是4左起第一个小的数字。此时栈里有1和4,然后数字6入栈的时候,栈顶元素4小于6,于是4就是6左起第一个小的数字。此时栈里有1,4,6,然后数字5入栈的时候,栈顶元素6大于5,将6移除,此时新的栈顶元素4小于5,那么4就是5左起的第一个小的数字,最终栈内数字为 1,4,5。
单调递减栈可以找到左起第一个比当前数字大的元素。这里就不举例说明了,同样的道理,大家可以自行验证一下。
方法 最佳 monotonous stack 单调栈
这个思路很机智,我们不管nums1, 先只用nums2,
把所有的nums[i]的左起第一个比自己大的都找出来存进map中。
出入栈过程是:
nums2[i]如果比栈上面的小,那么就入栈;反之,就把栈全部出空,并加入
map中,value = nums2[i]。
iteration结束最后剩在stack里的,说明没有左起比自己大的,
全部加到map里value = -1.
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Stack<Integer> myStack = new Stack<>();
Map<Integer,Integer> myMap = new HashMap<>();
int[] re = new int[nums1.length];
for(int n : nums2){
while(!myStack.empty() && n > myStack.peek()){
myMap.put(myStack.pop(), n);
}
myStack.push(n);
}
while(!myStack.empty()){
myMap.put(myStack.pop(),-1);
}
for(int i = 0; i < nums1.length; i++){
re[i] = myMap.get(nums1[i]);
}
return re;
}
}
Last updated
Was this helpful?