単調スタック - 次に大きな要素

496. 次に大きな要素

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

結果を格納するために、nums1 と同じサイズの配列結果を定義します。

結果配列の位置が割り当てられていない場合は -1 である必要があるため、-1 に初期化されます。

nums2 をたどる過程で、nums2[i] が nums1 に出現したかどうかを判断する必要があります。

要素を繰り返さずに、マッピングにマップを使用できます。

値に応じて添え字を素早く見つけ、nums1にnums2[i]が出現したかどうかも判断できます

次に、明確に分析する必要がある次の 3 つの状況を分析します。

  1. ケース 1:

現在トラバースされている要素 T[i] は、最上位の要素 T[temp.peek()] より小さいです

このとき、インクリメンタルスタック(スタック先頭からスタック末尾までの順序)を満たしているため、そのままスタックにプッシュされます。

  1. ケース 2:

現在トラバースされている要素 T[i] は、最上位要素 T[temp.peek()] に等しい

それらが等しい場合でも、それらはスタックに直接プッシュされます。これは、それ以上ではなく、自分自身より大きい右側の最初の要素を要求しているためです。

  1. ケース 3:

現在トラバースされている要素 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