package java程序员面试笔试宝典;
public class 题8_5_13求数组中两个元素的最小距离 {
public static void main(String[] args) {
int[] a={4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8};
int[] b={3,4};
//getMinDis(6, 11, a);
getMinDistance(3,4,b);
//System.out.println(getMinOnce(a, 8, 9, 4));
}
//好方法
public static int getMinDistance(int n1,int n2,int[] a){
int minDis=Integer.MAX_VALUE;
int index_n1=-a.length;
int index_n2=-a.length;
for (int i = 0; i < a.length; i++) {
if(a[i]==n1){
index_n1=i;
if(i-index_n2<minDis){
minDis=i-index_n2;
}
}else if(a[i]==n2){
index_n2=i;
if(i-index_n1<minDis){
minDis=i-index_n1;
}
}
}
if(minDis>=a.length){
System.out.println(-1);
return -1;
}else {
System.out.println(minDis);
return minDis;
}
}
//此种算法时间复杂度较小
public static int minDistance(int[] a,int n1,int n2){
if(a==null){
System.out.println("数组为空");
return Integer.MAX_VALUE;
}
int index_n1=-1;
int index_n2=-1;
int min=Integer.MAX_VALUE;
for (int i = 0; i < a.length; i++) {
if(a[i]==n1){
index_n1=i;
if(index_n2>0){
if(Math.abs(index_n2-index_n1)<min){
min=Math.abs(index_n2-index_n1);
}
}
}
if(a[i]==n2){
index_n2=i;
if(index_n1>0){
if(Math.abs(index_n2-index_n1)<min){
min=Math.abs(index_n2-index_n1);
}
}
}
}
if(min==Integer.MAX_VALUE){
System.out.println("error:未找到元素");
}
return min;
}
//自己写的方法,时间复杂度太大
public static int getMinOnce(int[] a,int n1,int k,int n2){
int dis=a.length;
boolean flag=false;
for (int i = k+1; i < a.length; i++) {
if(a[i]==n2){
dis=i-k;
flag=true;
break;
}
}
for (int i = k-1; i >=0; i--) {
if(a[i]==n2){
if(dis>k-1-i){
dis=k-i;
flag=true;
break;
}
}
}
if(flag) return dis;
else return Integer.MAX_VALUE;
}
public static void getMinDis(int n1,int n2,int[] a){
int min=Integer.MAX_VALUE;
for (int i = 0; i < a.length; i++) {
if(a[i]==n1){
if(getMinOnce(a, n1, i, n2)<min){
min=getMinOnce(a, n1, i, n2);
}
}
}
if(min==Integer.MAX_VALUE){
System.out.println("无此数据:error");
}
System.out.println(min);
}
}