Leetcode #496 Next Greater Eleme

2017-06-29  本文已影响0人  尴尴尬尬先生
public class Solution {
    public int[] nextGreaterElement(int[] findNums, int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        Stack<Integer> stack = new Stack<>();
        int[] res = new int[findNums.length];
        for(int num:nums){
            while(!stack.isEmpty()&&stack.peek()<num)
                map.put(stack.pop(), num);
            stack.push(num);
        }
        for(int i=0;i<findNums.length;i++){
            res[i] = map.getOrDefault(findNums[i], -1);
        }
        return res;
    }
}

直接看代码,维护一个map和一个stack,map的作用是保存每个值的next greater element。
具体过程为,遍历数组,若新来的元素,比stack中的元素小,则直接插入,若新来的元素,比stack顶部的元素大,则该元素即为栈顶元素的next greater element,将栈顶元素pop出来,并保存在map中,并循环该操作,直至栈内元素比新元素都大,再插入新元素。
遍历数组完成后,即得到所有元素的next greater element。
接下来只需要查找新数组的元素了。

类似的题目还有leetcode #503

public class Solution {
    public int[] nextGreaterElements(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        int len = nums.length;
        Stack<Integer> stack = new Stack<>();
        int[] res = new int[len];
        Arrays.fill(res, -1);
        for(int i=0;i<len*2;i++){
            while(!stack.isEmpty()&&nums[stack.peek()]<nums[i%len])
                res[stack.pop()]=nums[i%len];
            if(i<len) stack.push(i);
        }
        return res;
    }
}

此时之前题目中的两个数组变为一个,即假设该数组为头尾相连。
这时候的改法就是遍历数组两遍,并只在第一遍的时候插入栈。

上一篇下一篇

猜你喜欢

热点阅读