如何求数组中两个元素的最小距离

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);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值