496. Next Greater Element I

来源:互联网 发布:人肉软件是什么 编辑:程序博客网 时间:2024/06/08 08:51

问题描述:给你两个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好些。

原创粉丝点击