如何求数组中两个元素的最小距离(两种方法)

本文介绍了一种高效算法来寻找数组中两个指定数值的最短距离,提供了两种方法:蛮力法和动态规划法,并对比了它们的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  给定一个数组,数组中含有重复的元素,给定两个数字num1,num2,求这两个数字在数组中出现的位置的最小距离。
分析:
  对数组双重遍历,找出最小距离,但是这种方法效率比较低。由于在求距离时只关心num1,num2这两个数,因此只需要对数组进行一次遍历即可,在遍历的过程中分别记录num1,num2的位置就可以非常的方便的求出最小的距离,下面分别详细介绍两种思想方法:

方法一:蛮力法

  对数组进行双重遍历,外层循环遍历查找num1,只要遍历到num1,内层循环对数组从头开始遍历找出num2,每当遍历到num2,就计算他们的距离dist。当遍历结束后,最小的dist值就是它们的最小距离。
实现代码:

package lock;


public class T3 
{
	public static int minDistance(int[] arr,int num1,int num2)
	{
		if(arr==null||arr.length<=0)
		{
			System.out.println("参数不合格!");
			return Integer.MAX_VALUE;
		}
		int minDis=Integer.MAX_VALUE;   //num1与num2的最小距离
		int dist=0;
		for(int i=0;i<arr.length;i++)
		{
			if(arr[i]==num1)
			{
				for(int j=0;j<arr.length;++j)
				{
					if(arr[j]==num2)
					{
						dist=Math.abs(i-j);  //当前遍历的num1与num2的距离
						if(dist<minDis)
							minDis=dist;
					}
				}
			}
		}
		return minDis;
	}
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arr[]= {4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8};
		int num1=4;
		int num2=8;
		System.out.println(minDistance(arr,num1,num2));
	}

}

运行结果;

在这里插入图片描述

算法分析:

这种方法需要对数组进行两次遍历,因此,时间复杂度为O(N^2)

方法二:动态规划

  采用动态规划的方法吧每次遍历的结果记录下来从而可以减少遍历次数。
  1)当遇到num1时,记录下num1值对应的数组下标的位置lastPos1,通过lastPos1与上次遍历到num2下标的位置lastPos2的差可以求出最近一次遍历到的num1与num2的距离。
  2)当遇到num2时,同样记下它在的数组中下标的位置lastPos2,然后通过求lastPos2与上次遍历到num1的下标值lastPos1,求出最近一次遍历到的num1余num2的距离。

实验代码:

package lock;


public class T4 {
	public static int minDistance(int[] arr,int num1,int num2)
	{
		if(arr==null||arr.length<=0)
		{
			System.out.println("参数不合格!");
			return Integer.MAX_VALUE;
		}
		int lastPos1=-1; //上次遍历到num1的位置
		int lastPos2=-1; //上次遍历到num1的位置
		int minDis=Integer.MAX_VALUE;  //num1,num2的最小距离
		for(int i=0;i<arr.length;++i)
		{
			if(arr[i]==num1)
			{
				lastPos1=i;
				if(lastPos2>=0)
					minDis=Math.min(minDis, lastPos1-lastPos2);
			}
			if(arr[i]==num2)
			{
				lastPos2=i;
				if(lastPos1>=0)
					minDis=Math.min(minDis, lastPos2-lastPos1);
			}
		}
		return minDis;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arr[]= {4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8};
		int num1=4;
		int num2=8;
		System.out.println(minDistance(arr,num1,num2));
	}

}

实验结果:

在这里插入图片描述

算法分析:

  这种方法只需要对数组进行一次遍历,因此,时间复杂度为O(N)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值