496. 下一个更大元素 I(leetcode)

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

根据校验nums2中的元素是否存在于nums1中 的时机 分为不同做法

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Deque<Integer> st = new ArrayDeque<>();
        int[] res=new int[nums1.length];
        // 存储位置映射
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums1.length;i++)
            map.put(nums1[i],i);
        Arrays.fill(res,-1);
        for(int i=0;i<nums2.length;i++)
        {  
            while(!st.isEmpty() && nums2[i]>nums2[st.peek()]) // 比较之前遍历过的元素
            {
                // nums2[i]此时是栈顶的答案,下一个循环继续比较栈顶
                int top=nums2[st.pop()];
                if(map.containsKey(top)) // 判断元素是否存在于nums1中
                    res[map.get(top)]=nums2[i];
            }
            //此时nums2[i]是小于栈顶的,加入成为新的栈顶
            st.push(i); // 当前元素小于栈顶元素,加入成为新的栈顶
        }
        return res;
    }
}
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Deque<Integer> st = new ArrayDeque<>();
        int[] res=new int[nums1.length];
        // 存储位置映射
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums1.length;i++)
            map.put(nums1[i],i);
        Arrays.fill(res,-1);
        for(int i=0;i<nums2.length;i++)
        {  
            while(!st.isEmpty() && nums2[i]>nums2[st.peek()]) // 比较之前遍历过的元素
            {
                // nums2[i]此时是栈顶的答案,下一个循环继续比较栈顶
                int top=nums2[st.pop()];
                res[map.get(top)]=nums2[i];
            }
            //此时nums2[i]是小于栈顶的,加入成为新的栈顶
            if(map.containsKey(nums2[i]))st.push(i); // 判断元素是否存在于nums1中
        }
        return res;
    }
}

 

posted @ 2024-09-15 17:17  风乐  阅读(11)  评论(0)    收藏  举报