【正确答案】
【答案解析】问题描述:给定一个数组,数组中含有重复元素,给出两个数n1和n2,求这两个数字在数组中所出现位置的最小距离,例如,数组{4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8}中,4和8的最小距离为2。
实现思路如下:遍历数组,会遇到以下两种情况。
1)当遇到n1时,记录下n1值对应的数组下标的位置n1_index,通过求n1_index与上次遍历到n2的下标值n2_index的差,可以求出最近一次遍历到的n1与n2的距离。
2)当遇到n2时,同样记录下它在数组中下标的位置n2_index,然后通过求n2_index与上次遍历到n1的下标值n1_index的差,求出最近一次遍历到的n1与n2的距离。
定义一个变量min_dist记录n1与n2的最小距离,在以上两种情况下,每次求出n1与n2的距离后与min_dist相比,求最小值。这样只需对数组进行一次遍历就可以求出最小距离,因此时间复杂度为O(n)。实现代码如下:
public class Test{
private static int min(int a, int b){
return a>b?b:a;
}
public static int minDistance(int a[], int n1, int n2){
if(a==null)
return Integer.MIN_VALUE;
int len=a.length;
int n1_index=-1;
int n2_index=-1;
int min_dist=Integer.MIN_VALUE+1;
for(int i=0; i<len; ++i){
if(a[i]==n1){
n1_index=i;
if(n2_index>=0)
min_dist=min(Math.ahs(min_dist), Math.abs(n1_index-n2_index));}
if(a[i]==n2){
n2_index=i;
if(n1_index>=0)
min_dist=min(Math.abs(min_dist), Math.abs(n2_index-n1_index));
}
}
return min_dist;
}
public staric void main(String[]args){
int a[]={4, 5, 6, 4, 7, 4, 6, 4, 7, 8, 5, 6, 4, 3, 10, 8};
System.out.println(minDistanee(a, 4, 8));
}
}
程序运行结果为:
2