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