[Monotonic Stack] 496. Next larger element I

496. Next Greater Element I

Problem-solving ideas

  • First calculate the next element larger than each element of nums2, using a monotonic stack
  • Combine the above result and each element in nums2 to form a mapping map
  • Query the map for each element of Nums1 and record the value of the map
class Solution {
    
    
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    
    
        // 计算nums2的每一个元素的下一个更大的元素
        int[] greater = nextGreaterElement(nums2);

        // 转换为映射  将nums2的每一个元素和greater中的元素进行对应
        Map<Integer,Integer> greaterMap = new HashMap<>();


        for(int i =0; i < nums2.length; i++){
    
    
            greaterMap.put(nums2[i],greater[i]);// 存储映射
        }

        // nums1 是 nums2的子集  所以根据greaterMap 可以得到结果
        // 从Nums2找到每一个元素
        int[] res = new int[nums1.length];
        for(int i = 0; i < nums1.length; i++){
    
    
            res[i] = greaterMap.get(nums1[i]);
        }

        return res;
    }
    
    // 计算一个数组元素的所有单调栈元素
    public int[] nextGreaterElement(int[] nums){
    
    
        // 计算单调栈
        int n = nums.length;

        // 存放答案的数组
        int[] res = new int[n];
        Stack<Integer> s = new Stack<>();

        // 到这往栈存放
        for(int i = n - 1; i >= 0; i--){
    
    
            // 判断各自高矮
            while(!s.isEmpty() && s.peek() <= nums[i]){
    
    
                // 如果栈顶元素 小于等于当前 元素 直接将站内元素出栈
                s.pop();
            }

            // 存放比当前元素大的元素
            res[i] = s.isEmpty() ? -1 : s.peek();// 如果不是空的  直接存放栈顶元素
            s.push(nums[i]);
        }

        return res;
    }
}

Guess you like

Origin blog.csdn.net/qq_44653420/article/details/133325038