496. Next Greater Element I

问题描述:给你两个int数组,数组1是数组2的子集并且数组1,数组2中没有重复的数。查找数组1的数在数组2中,后续是否有比它大的数。有则返回数字,没有则返回-1;
思路:用map储存数组1中各个数字位置。遍历数组2时,从map中记录的位置开始遍历,从而提升效率。
原答案:

    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int length=nums2.length;
        if(length==0)
            return nums1;
        int maxNum=nums2[0];
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int i=0;i<length;i++){
            if(nums2[i]>maxNum)
                maxNum=nums2[i];
            map.put(nums2[i],i);
        }
        int nums1length=nums1.length;
        int[] res=new int[nums1length];
        for(int j=0;j<nums1length;j++){
            if(nums1[j]>maxNum){
                res[j]=-1;
                break;
            }
            res[j]=-1;
            int pos=map.get(nums1[j]);
            for(int k=pos+1;k<length;k++){
                if(nums2[k]>nums1[j]){
                    res[j]=nums2[k];
                    break;
                }
            }
        }
        return res;
    }

最佳答案:

    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int [] ret=new int[nums1.length];

        int max=Integer.MIN_VALUE;
        int min=Integer.MAX_VALUE;

        Arrays.fill(ret,-1);

        for(int a: nums2){
            max=Math.max(max,a);
            min=Math.min(min,a);
        }

        int [] index=new int[max-min+1];

        for(int i =0;i<nums2.length; i++){
            index[nums2[i]-min]=i;
        }

        for(int i=0;i<nums1.length;i++){
            int need=nums1[i];
            for(int j=index[need-min];j<nums2.length;j++){
                if(nums2[j]>need){
                    ret[i]=nums2[j];
                    break;
                }
            }
        }

        return ret;
    }

尽管题目没有明确给出数组的上下界。但是可以先遍历数组找出上下界然后构造一个记录的数组。这要比map好些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值