【单调栈】496. 下一个更大元素 I

496. 下一个更大元素 I

解题思路

  • 首先计算nums2的每一个元素的下一个比他大的元素,使用单调栈
  • 将上面的结果和nums2中的每一个元素组成映射map
  • 针对每一个Nums1的元素 查询map 记录map 的value
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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44653420/article/details/133325038