📌  相关文章
📜  找到两个数字之间的最小距离

📅  最后修改于: 2022-05-13 01:57:51.112000             🧑  作者: Mango

找到两个数字之间的最小距离

给定一个未排序的数组arr[]和两个数字xy ,找到arr[]xy之间的最小距离。该数组也可能包含重复项。您可以假设xy都不同并且存在于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

方法一:

  • 方法:任务是找到两个给定数字之间的距离,因此使用嵌套循环找到任意两个元素之间的距离。用于选择第一个元素 (x) 的外部循环和用于遍历数组以搜索另一个元素 (y) 并获取它们之间的最小距离的内部循环。
  • 算法:
    1. 创建一个变量m = INT_MAX
    2. 运行一个嵌套循环,外循环从头到尾运行(循环计数器 i),内循环从 i+1 运行到结束(循环计数器 j)。
    3. 如果第 i 个元素为 x,第 j 个元素为 y,反之亦然,将 m 更新为m = min(m,ji)
    4. 打印 m 的值作为最小距离
  • 执行:
C++
// C++ program to Find the minimum
// distance between two numbers
#include 
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);
            }
        }
    }
    if (min_dist > n) {
        return -1;
    }
    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  // for INT_MAX
#include 
#include  // for abs()
 
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);
            }
        }
    }
    if (min_dist > n) {
        return -1;
    }
    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 = 0;
    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);
            }
        }
        if (min_dist > n) {
            return -1;
        }
        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 = 0;
        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
 abs($i - $j))
            {
                $min_dist = abs($i - $j);
            }
        }
    }
  if($min_dist>$n)
      {
        return -1;
      }
    return $min_dist;
}
 
    // Driver Code
    $arr = array(3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3);
    $n = count($arr);
    $x = 0;
    $y = 6;
 
    echo "Minimum distance between ",$x, " and ",$y," is ";
    echo minDist($arr, $n, $x, $y);
 
// This code is contributed by anuj_67.
?>


Javascript


C++
// C++ implementation of above approach
#include 
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


C
#include 
#include  // 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


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


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 previous 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


PHP


Javascript


输出
Minimum distance between 3 and 6 is 4
  • 复杂性分析:
    • 时间复杂度: O(n^2),使用嵌套循环遍历数组。
    • 空间复杂度: O(1),不需要额外的空间。

方法二:

  • 方法:所以基本方法是只检查连续的 x 和 y 对。对于每个元素 x 或 y,检查先前出现的 x 或 y 的索引,如果先前出现的元素与当前元素不相似,则更新最小距离。但是出现了一个问题,如果一个 x 前面有另一个 x 并且前面有 ay,那么如何获得对之间的最小距离。通过仔细分析可以看出,每个 x 后跟 ay 或反之亦然只能是最近的对(最小距离),因此忽略所有其他对。
  • 算法:
    1. 创建一个变量prev=-1m= INT_MAX
    2. 从头到尾遍历数组。
    3. 如果当前元素为x或y,prev不等于-1且array[prev]不等于当前元素则更新m = max(current_index – prev, m),即求连续对之间的距离并更新m用它。
    4. 打印 m 的值
  • 感谢 wgpshashank 提出这种方法。

  • 执行。

C++

// C++ implementation of above approach
#include 
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

C

#include 
#include  // 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

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

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 previous 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

PHP


Javascript


输出
Minimum distance between 3 and 6 is 1
  • 复杂性分析:
  • 时间复杂度: O(n)。
    只需要遍历一次数组。
  • 空间复杂度: O(1)。
    因为不需要额外的空间。