找到两个数字之间的最小距离
给定一个未排序的数组arr[]和两个数字x和y ,找到arr[]中x和y之间的最小距离。该数组也可能包含重复项。您可以假设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
方法一:
- 方法:任务是找到两个给定数字之间的距离,因此使用嵌套循环找到任意两个元素之间的距离。用于选择第一个元素 (x) 的外部循环和用于遍历数组以搜索另一个元素 (y) 并获取它们之间的最小距离的内部循环。
- 算法:
- 创建一个变量m = INT_MAX
- 运行一个嵌套循环,外循环从头到尾运行(循环计数器 i),内循环从 i+1 运行到结束(循环计数器 j)。
- 如果第 i 个元素为 x,第 j 个元素为 y,反之亦然,将 m 更新为m = min(m,ji)
- 打印 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 或反之亦然只能是最近的对(最小距离),因此忽略所有其他对。
- 算法:
- 创建一个变量prev=-1和m= INT_MAX
- 从头到尾遍历数组。
- 如果当前元素为x或y,prev不等于-1且array[prev]不等于当前元素则更新m = max(current_index – prev, m),即求连续对之间的距离并更新m用它。
- 打印 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)。
因为不需要额外的空间。