单调栈--下一个更大元素

496.下一个更大元素

https://leetcode.cn/problems/next-greater-element-i/submissions/

定义一个和nums1一样大小的数组result来存放结果

result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1

在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过

没有重复元素,我们就可以用map来做映射

根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过

接下来就要分析如下三种情况,一定要分析清楚。

  1. 情况一:

当前遍历的元素T[i]小于栈顶元素T[temp.peek()]的情况

此时满足递增栈(栈头到栈底的顺序),所以直接入栈。

  1. 情况二:

当前遍历的元素T[i]等于栈顶元素T[temp.peek()]的情况

如果相等的话,依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于!

  1. 情况三:

当前遍历的元素T[i]大于栈顶元素T[temp.peek()]的情况

此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。

判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Stack<Integer> temp = new Stack<>();//单调栈,递增
        int[] res = new int[nums1.length];//记录结果集
        Arrays.fill(res,-1);//初始化-1
        HashMap<Integer,Integer> hashmap = new HashMap<>();//利用没有重复的特性
        for(int i=0;i<nums1.length;i++){
                hashmap.put(nums1[i],i);
        }
        temp.add(0);
        for(int i=1;i<nums2.length;i++){
            if(nums2[i] <= nums2[temp.peek()]){
                temp.add(i);
            }else{
                while(!temp.isEmpty() && nums2[temp.peek()] < nums2[i]){
                    if(hashmap.containsKey(nums2[temp.peek()])){
                         Integer index = hashmap.get(nums2[temp.peek()]);
                         res[index] = nums2[i];
                    }
                    temp.pop();
                }
                temp.add(i);
            }

        }
        return res;
    }
}

503.下一个更大元素2

https://leetcode.cn/problems/next-greater-element-ii/submissions/

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int size = nums.length;
        Stack<Integer> temp = new Stack<>();
        int[] res = new int[size];
        if(nums == null || nums.length <=1){
            return new int[]{-1};
        }
        Arrays.fill(res,-1);

        for(int i=0;i<2*size;i++){
            while(!temp.isEmpty() && nums[i%size] > nums[temp.peek()]){
                res[temp.peek()] = nums[i% size];
                    temp.pop();
            }
                temp.push(i%size);
        }
return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_56194193/article/details/129089892