Bootstrap

力扣496 下一个更大元素 I easy 20220328

方法一:暴力破解 

三层循环遍历

①第一层遍历nums1,获取当前元素e

②第二层遍历num2,找到当前元素e在num2中的位置index

③第三层,从index开始遍历num2,找到第一个大于e的元素

方法二:栈+哈希表

第 1 个子问题:如何更高效地计算nums 2中每个元素右边的第一个更大的值;

第 2 个子问题:如何存储第 1 个子问题的结果。

1.栈:用栈来排查当前元素右侧第一个最大元素

①倒序遍历num2数组元素{

        ②判断栈是否为空,为空则表示当前元素右侧没有比它大的值,直接map记录当前元素右侧第一个最大元素为-1,并将当前元素入栈。

        ③如果栈不为空,并且当前元素大于栈顶元素,则表示栈顶元素不是当前元素右侧第一个最大值,此时将栈顶元素弹出,若当前元素仍然大于新的栈顶元素,继续弹出,直到当前元素小于新的栈顶元素,表示此时的栈顶元素就是当前元素右侧第一个最大元素(栈中存储数据从栈顶开始升序的)将当前元素入栈,并将当前元素与栈顶元素记录在map中,如果当前元素一直>新的栈顶元素,直到栈元素都弹空了,说明当前元素右侧没有比它大的值。

}

2.哈希表:用来记录当前元素与其右侧第一个最大元素的映射

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int len1=nums1.length;
        int len2=nums2.length;
        int[] ans=new int[len1];
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                if(nums1[i]==nums2[j]){
                    for(int k=j;k<len2;k++){
                        if(nums2[k]>nums1[i]){
                            ans[i]=nums2[k];
                            break;
                        }else{
                            ans[i]=-1;
                        }
                    }
                    break;
                }
            }
        }
        return ans;
    }
}

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        Deque<Integer> stack = new ArrayDeque<Integer>();
        //从后开始遍历num2数组
        for (int i = nums2.length - 1; i >= 0; --i) {
            int num = nums2[i];
            //找到当前元素右侧第一个最大值
            //栈不为空,且当前元素大于栈顶元素,则弹出栈顶元素,最后栈为空表示当前元素右侧没有比它大的值
            while (!stack.isEmpty() && num >= stack.peek()) {
                stack.pop();
            }
            //map记录每个元素与其右侧第一个最大值之间的映射,栈为空,则没有比它大的值
            map.put(num, stack.isEmpty() ? -1 : stack.peek());
            stack.push(num);
        }
        int[] res = new int[nums1.length];
        //从map中取出指定元素的右侧第一个最大值
        for (int i = 0; i < nums1.length; ++i) {
            res[i] = map.get(nums1[i]);
        }
        return res;
    }
}

;