给定一个数组,数组中含有重复的元素,给定两个数字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)。
本文介绍了一种高效算法来寻找数组中两个指定数值的最短距离,提供了两种方法:蛮力法和动态规划法,并对比了它们的时间复杂度。

被折叠的 条评论
为什么被折叠?



