🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 找到两个数字之间的最小距离 > 原文: [https://www.geeksforgeeks.org/find-the-minimum-distance-between-two-numbers/](https://www.geeksforgeeks.org/find-the-minimum-distance-between-two-numbers/) 给定未排序的数组 **arr []** 和两个数字 **x** 和 **y** ,找出 **x** 和 **y [ **arr []** 中的 HTG9]。 数组也可能包含重复项。 您可以假设 **x** 和 **y** 都不相同,并且存在于 **arr []** 中。** **示例**: ``` Input: arr[] = {1, 2}, x = 1, y = 2 Output: Minimum distance between 1 and 2 is 1. Explanation: 1 is at index 0 and 2 is at index 1, so the distance is 1 Input: arr[] = {3, 4, 5}, x = 3, y = 5 Output: Minimum distance between 3 and 5 is 2. Explanation:3 is at index 0 and 5 is at index 2, so the distance is 2 Input: arr[] = {3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3}, x = 3, y = 6 Output: Minimum distance between 3 and 6 is 4. Explanation:3 is at index 0 and 6 is at index 5, so the distance is 4 Input: arr[] = {2, 5, 3, 5, 4, 4, 2, 3}, x = 3, y = 2 Output: Minimum distance between 3 and 2 is 1. Explanation:3 is at index 7 and 2 is at index 6, so the distance is 1 ``` **方法 1**: * **方法**:该任务是查找两个给定数字之间的距离,因此,使用嵌套循环查找任意两个元素之间的距离。 用于选择第一个元素(x)的外循环和用于遍历数组以搜索另一个元素(y)并在它们之间采用最小距离的内循环。 * **算法**: 1. 创建一个变量 *m = INT_MAX* 2. 运行一个嵌套循环,外循环从头到尾运行(循环计数器 i),内循环从 i + 1 到结束运行(循环计数器 j)。 3. 如果第 ith 个元素是 x,第 j 个元素是 y,反之亦然,则将 m 更新为 *m = min(m,j-i)* 4. 打印 m 的值作为最小距离 * **实现**: ## C++ ``` // C++ program to Find the minimum // distance between two numbers #include <bits/stdc++.h> using namespace std;  int minDist(int arr[], int n, int x, int y) {     int i, j;     int min_dist = INT_MAX;     for (i = 0; i < n; i++)     {         for (j = i+1; j < n; j++)         {             if( (x == arr[i] && y == arr[j] ||                 y == arr[i] && x == arr[j]) &&                 min_dist > abs(i-j))             {                 min_dist = abs(i-j);             }         }     }     return min_dist; } /* Driver code */ int main()  {     int arr[] = {3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3};     int n = sizeof(arr)/sizeof(arr[0]);     int x = 3;     int y = 6;     cout << "Minimum distance between " << x <<                      " and " << y << " is " <<                      minDist(arr, n, x, y) << endl; } // This code is contributed by Shivi_Aggarwal ``` ## C ``` // C program to Find the minimum // distance between two numbers #include <stdio.h> #include <stdlib.h> // for abs() #include <limits.h> // for INT_MAX int minDist(int arr[], int n, int x, int y) {    int i, j;    int min_dist = INT_MAX;    for (i = 0; i < n; i++)    {      for (j = i+1; j < n; j++)      {          if( (x == arr[i] && y == arr[j] ||               y == arr[i] && x == arr[j]) && min_dist > abs(i-j))          {               min_dist = abs(i-j);          }      }    }    return min_dist; } /* Driver program to test above function */ int main()  {     int arr[] = {3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3};     int n = sizeof(arr)/sizeof(arr[0]);     int x = 3;     int y = 6;     printf("Minimum distance between %d and %d is %d\n", x, y,                minDist(arr, n, x, y));     return 0; } ``` ## Java ``` // Java Program to Find the minimum // distance between two numbers class MinimumDistance  {     int minDist(int arr[], int n, int x, int y)      {         int i, j;         int min_dist = Integer.MAX_VALUE;         for (i = 0; i < n; i++)          {             for (j = i + 1; j < n; j++)              {                 if ((x == arr[i] && y == arr[j]                     || y == arr[i] && x == arr[j])                     && min_dist > Math.abs(i - j))                      min_dist = Math.abs(i - j);             }         }         return min_dist;     }     public static void main(String[] args)      {         MinimumDistance min = new MinimumDistance();         int arr[] = {3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3};         int n = arr.length;         int x = 3;         int y = 6;         System.out.println("Minimum distance between " + x + " and " + y                  + " is " + min.minDist(arr, n, x, y));     } } ``` ## Python3 ``` # Python3 code to Find the minimum # distance between two numbers def minDist(arr, n, x, y):     min_dist = 99999999     for i in range(n):         for j in range(i + 1, n):             if (x == arr[i] and y == arr[j] or             y == arr[i] and x == arr[j]) and min_dist > abs(i-j):                 min_dist = abs(i-j)         return min_dist # Driver code arr = [3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3] n = len(arr) x = 3 y = 6 print("Minimum distance between ",x," and ",      y,"is",minDist(arr, n, x, y)) # This code is contributed by "Abhishek Sharma 44" ``` ## C# ``` // C# code to Find the minimum // distance between two numbers using System; class GFG {     static int minDist(int []arr, int n,                            int x, int y)      {         int i, j;         int min_dist = int.MaxValue;         for (i = 0; i < n; i++)          {             for (j = i + 1; j < n; j++)              {                 if ((x == arr[i] &&                       y == arr[j] ||                       y == arr[i] &&                         x == arr[j])                     && min_dist >                    Math.Abs(i - j))                     min_dist =                     Math.Abs(i - j);             }         }         return min_dist;     }     // Driver function     public static void Main()     {         int []arr = {3, 5, 4, 2, 6,               5, 6, 6, 5, 4, 8, 3};         int n = arr.Length;         int x = 3;         int y = 6;         Console.WriteLine("Minimum "                + "distance between "          + x +  " and " + y + " is "             + minDist(arr, n, x, y));     } } // This code is contributed by Sam007 ``` ## PHP ``` <?php // PHP program to Find the minimum  // distance between two numbers function minDist($arr, $n, $x, $y) {     $i; $j;     $min_dist = PHP_INT_MAX;     for ($i = 0; $i < $n; $i++)     {         for ($j = $i + 1; $j < $n; $j++)         {             if( ($x == $arr[$i] and $y == $arr[$j] or                 $y == $arr[$i] and $x == $arr[$j]) and                              $min_dist > abs($i - $j))             {                 $min_dist = abs($i - $j);             }         }     }     return $min_dist; }     // Driver Code     $arr = array(3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3);     $n = count($arr);     $x = 3;     $y = 6;     echo "Minimum distance between ",$x, " and ",$y," is ";      echo minDist($arr, $n, $x, $y); // This code is contributed by anuj_67\. ?> ``` **输出**: ``` Minimum distance between 3 and 6 is 4 ``` * **复杂度分析**: * **时间复杂度**: O(n ^ 2),嵌套循环用于遍历数组。 * **空间复杂度**:`O(1)`,不需要额外的空间。 **方法 2**: * **方法**:因此,基本方法是仅检查 x 和 y 的连续对。 对于每个元素 x 或 y,检查先前出现的 x 或 y 的索引,如果先前出现的元素与当前元素不相似,则更新最小距离。 但是出现一个问题,如果一个 x 前面有另一个 x 并且在 y 前面有一个 y,那么如何获得线对之间的最小距离呢? 通过仔细分析,可以看到每个 x 后面紧跟着 y,反之亦然,只能是最接近的对(最小距离),因此忽略所有其他对。 * **算法**: 1. 创建变量 *prev = -1* 和 *m = INT_MAX* 2. 从头到尾遍历整个数组。 3. 如果当前元素是 x 或 y,则 prev 不等于-1 并且 array [prev]不等于当前元素,则更新 m = max(current_index – prev,m),即找到连续对之间的距离并更新 m 用它。 4. 打印 m 的值 * *感谢 wgpshashank 提出了这种方法。* ![](https://img.kancloud.cn/e5/4b/e54b77218e0ad4c4f807fec6efbc5012_1200x738.png) **实现。** ## C++ ``` // C++ implementation of above approach #include <bits/stdc++.h> using namespace std; int minDist(int arr[], int n, int x, int y) {     //previous index and min distance     int p = -1, min_dist = INT_MAX;     for(int i=0 ; i<n ; i++)     {         if(arr[i]==x || arr[i]==y)         {             //we will check if p is not equal to -1 and              //If the element at current index matches with             //the element at index p , If yes then update              //the minimum distance if needed              if( p != -1 && arr[i] != arr[p])                 min_dist = min(min_dist , i-p);             //update the previos index              p=i;         }     }     //If distance is equal to int max      if(min_dist==INT_MAX)         return -1;     return min_dist; } /* Driver code */ int main() {     int arr[] = {3, 5, 4, 2, 6, 3, 0, 0, 5, 4, 8, 3};     int n = sizeof(arr) / sizeof(arr[0]);     int x = 3;     int y = 6;     cout << "Minimum distance between " << x <<                         " and " << y << " is "<<                         minDist(arr, n, x, y) << endl;     return 0; } // This code is contributed by Mukul singh. ``` ## C ``` #include <stdio.h> #include <limits.h> // For INT_MAX //returns minimum of two numbers int min(int a ,int b) {     if(a < b)         return a;     return b; } int minDist(int arr[], int n, int x, int y) {     //previous index and min distance     int i=0,p=-1, min_dist=INT_MAX;     for(i=0 ; i<n ; i++)     {         if(arr[i] ==x || arr[i] == y)         {             //we will check if p is not equal to -1 and              //If the element at current index matches with             //the element at index p , If yes then update              //the minimum distance if needed              if(p != -1 && arr[i] != arr[p])                 min_dist = min(min_dist,i-p);             //update the previos index              p=i;         }     }     //If distance is equal to int max      if(min_dist==INT_MAX)        return -1;     return min_dist; } /* Driver program to test above function */ int main() {     int arr[] ={3, 5, 4, 2, 6, 3, 0, 0, 5, 4, 8, 3};     int n = sizeof(arr)/sizeof(arr[0]);     int x = 3;     int y = 6;     printf("Minimum distance between %d and %d is %d\n", x, y,             minDist(arr, n, x, y));     return 0; } ``` ## Java ``` class MinimumDistance {     int minDist(int arr[], int n, int x, int y)      {     //previous index and min distance     int i=0,p=-1, min_dist=Integer.MAX_VALUE;     for(i=0 ; i<n ; i++)     {         if(arr[i] ==x || arr[i] == y)         {             //we will check if p is not equal to -1 and              //If the element at current index matches with             //the element at index p , If yes then update              //the minimum distance if needed              if(p != -1 && arr[i] != arr[p])                 min_dist = Math.min(min_dist,i-p);             //update the previous index              p=i;         }     }     //If distance is equal to int max      if(min_dist==Integer.MAX_VALUE)        return -1;     return min_dist; }     /* Driver program to test above functions */     public static void main(String[] args) {         MinimumDistance min = new MinimumDistance();         int arr[] = {3, 5, 4, 2, 6, 3, 0, 0, 5, 4, 8, 3};         int n = arr.length;         int x = 3;         int y = 6;         System.out.println("Minimum distance between " + x + " and " + y                 + " is " + min.minDist(arr, n, x, y));     } } ``` ## Python3 ``` import sys def minDist(arr, n, x, y):     #previous index and min distance     i=0     p=-1     min_dist = sys.maxsize;     for i in range(n):          if(arr[i] ==x or arr[i] == y):             #we will check if p is not equal to -1 and              #If the element at current index matches with             #the element at index p , If yes then update              #the minimum distance if needed              if(p != -1 and arr[i] != arr[p]):                 min_dist = min(min_dist,i-p)             #update the previos index              p=i     #If distance is equal to int max      if(min_dist == sys.maxsize):        return -1     return min_dist # Driver program to test above function */ arr = [3, 5, 4, 2, 6, 3, 0, 0, 5, 4, 8, 3] n = len(arr) x = 3 y = 6 print ("Minimum distance between %d and %d is %d\n"%( x, y,minDist(arr, n, x, y))); # This code is contributed by Shreyanshi Arun. ``` ## C# ``` // C# program to Find the minimum  // distance between two numbers using System; class MinimumDistance {     static int minDist(int []arr, int n,                        int x, int y)      {     //previous index and min distance     int i=0,p=-1, min_dist=int.MaxValue;     for(i=0 ; i<n ; i++)     {         if(arr[i] ==x || arr[i] == y)         {             //we will check if p is not equal to -1 and              //If the element at current index matches with             //the element at index p , If yes then update              //the minimum distance if needed              if(p != -1 && arr[i] != arr[p])                 min_dist = Math.Min(min_dist,i-p);             //update the previos index              p=i;         }     }     //If distance is equal to int max      if(min_dist==int.MaxValue)        return -1;    return min_dist; }     // Driver Code     public static void Main()      {         int []arr = {3, 5, 4, 2, 6, 3,                       0, 0, 5, 4, 8, 3};         int n = arr.Length;         int x = 3;         int y = 6;         Console.WriteLine("Minimum distance between " + x + " and " + y                                        + " is " + minDist(arr, n, x, y));     } } // This code is contributed by anuj_67\. ``` ## PHP ``` <?php // PHP program to Find the minimum  // distance between two numbers function minDist($arr, $n, $x, $y) {     //previous index and min distance     $i=0;     $p=-1;     $min_dist=PHP_INT_MAX;     for($i=0 ; $i<$n ; $i++)     {         if($arr[$i] ==$x || $arr[$i] == $y)         {             //we will check if p is not equal to -1 and              //If the element at current index matches with             //the element at index p , If yes then update              //the minimum distance if needed              if($p != -1 && $arr[$i] != $arr[$p])                 $min_dist = min($min_dist,$i-$p);             //update the previous index              $p=$i;         }     }     //If distance is equal to int max      if($min_dist==PHP_INT_MAX)        return -1;     return $min_dist; } /* Driver program to test above function */     $arr =array(3, 5, 4, 2, 6, 3, 0, 0, 5,                                     4, 8, 3);     $n = count($arr);     $x = 3;     $y = 6;     echo "Minimum distance between $x and ",          "$y is ", minDist($arr, $n, $x, $y); // This code is contributed by anuj_67\. ?> ``` **输出**: ``` Minimum distance between 3 and 6 is 1 ``` * **复杂度分析**: * **时间复杂度**:`O(n)`。 仅需要遍历数组一次。 * **空间复杂度**:`O(1)`。 由于不需要额外的空间。 如果您发现上述代码/算法有误,请写评论,或者找到其他解决相同问题的方法。