给定一个排序的整数数组。我们需要找到最接近给定数字的值。数组可能包含重复值和负数。
例子:
Input : arr[] = {1, 2, 4, 5, 6, 6, 8, 9}
Target number = 11
Output : 9
9 is closest to 11 in given array
Input :arr[] = {2, 5, 6, 7, 8, 8, 9};
Target number = 4
Output : 5
一个简单的解决方案是遍历给定的数组并跟踪当前元素与每个元素的绝对差。最后返回具有最小绝对值差的元素。
一个有效的解决方案是使用二进制搜索。
C++
// CPP program to find element
// closet to given target.
#include
using namespace std;
int getClosest(int, int, int);
// Returns element closest to target in arr[]
int findClosest(int arr[], int n, int target)
{
// Corner cases
if (target <= arr[0])
return arr[0];
if (target >= arr[n - 1])
return arr[n - 1];
// Doing binary search
int i = 0, j = n, mid = 0;
while (i < j) {
mid = (i + j) / 2;
if (arr[mid] == target)
return arr[mid];
/* If target is less than array element,
then search in left */
if (target < arr[mid]) {
// If target is greater than previous
// to mid, return closest of two
if (mid > 0 && target > arr[mid - 1])
return getClosest(arr[mid - 1],
arr[mid], target);
/* Repeat for left half */
j = mid;
}
// If target is greater than mid
else {
if (mid < n - 1 && target < arr[mid + 1])
return getClosest(arr[mid],
arr[mid + 1], target);
// update i
i = mid + 1;
}
}
// Only single element left after search
return arr[mid];
}
// Method to compare which one is the more close.
// We find the closest by taking the difference
// between the target and both values. It assumes
// that val2 is greater than val1 and target lies
// between these two.
int getClosest(int val1, int val2,
int target)
{
if (target - val1 >= val2 - target)
return val2;
else
return val1;
}
// Driver code
int main()
{
int arr[] = { 1, 2, 4, 5, 6, 6, 8, 9 };
int n = sizeof(arr) / sizeof(arr[0]);
int target = 11;
cout << (findClosest(arr, n, target));
}
// This code is contributed bu Smitha Dinesh Semwal
Java
// Java program to find element closet to given target.
import java.util.*;
import java.lang.*;
import java.io.*;
class FindClosestNumber {
// Returns element closest to target in arr[]
public static int findClosest(int arr[], int target)
{
int n = arr.length;
// Corner cases
if (target <= arr[0])
return arr[0];
if (target >= arr[n - 1])
return arr[n - 1];
// Doing binary search
int i = 0, j = n, mid = 0;
while (i < j) {
mid = (i + j) / 2;
if (arr[mid] == target)
return arr[mid];
/* If target is less than array element,
then search in left */
if (target < arr[mid]) {
// If target is greater than previous
// to mid, return closest of two
if (mid > 0 && target > arr[mid - 1])
return getClosest(arr[mid - 1],
arr[mid], target);
/* Repeat for left half */
j = mid;
}
// If target is greater than mid
else {
if (mid < n-1 && target < arr[mid + 1])
return getClosest(arr[mid],
arr[mid + 1], target);
i = mid + 1; // update i
}
}
// Only single element left after search
return arr[mid];
}
// Method to compare which one is the more close
// We find the closest by taking the difference
// between the target and both values. It assumes
// that val2 is greater than val1 and target lies
// between these two.
public static int getClosest(int val1, int val2,
int target)
{
if (target - val1 >= val2 - target)
return val2;
else
return val1;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 1, 2, 4, 5, 6, 6, 8, 9 };
int target = 11;
System.out.println(findClosest(arr, target));
}
}
Python 3
# Python3 program to find element
# closet to given target.
# Returns element closest to target in arr[]
def findClosest(arr, n, target):
# Corner cases
if (target <= arr[0]):
return arr[0]
if (target >= arr[n - 1]):
return arr[n - 1]
# Doing binary search
i = 0; j = n; mid = 0
while (i < j):
mid = (i + j) / 2
if (arr[mid] == target):
return arr[mid]
# If target is less than array
# element, then search in left
if (target < arr[mid]) :
# If target is greater than previous
# to mid, return closest of two
if (mid > 0 and target > arr[mid - 1]):
return getClosest(arr[mid - 1], arr[mid], target)
# Repeat for left half
j = mid
# If target is greater than mid
else :
if (mid < n - 1 and target < arr[mid + 1]):
return getClosest(arr[mid], arr[mid + 1], target)
# update i
i = mid + 1
# Only single element left after search
return arr[mid]
# Method to compare which one is the more close.
# We find the closest by taking the difference
# between the target and both values. It assumes
# that val2 is greater than val1 and target lies
# between these two.
def getClosest(val1, val2, target):
if (target - val1 >= val2 - target):
return val2
else:
return val1
# Driver code
arr = [1, 2, 4, 5, 6, 6, 8, 9]
n = len(arr)
target = 11
print(findClosest(arr, n, target))
# This code is contributed by Smitha Dinesh Semwal
C#
// C# program to find element
// closet to given target.
using System;
class GFG
{
// Returns element closest
// to target in arr[]
public static int findClosest(int []arr,
int target)
{
int n = arr.Length;
// Corner cases
if (target <= arr[0])
return arr[0];
if (target >= arr[n - 1])
return arr[n - 1];
// Doing binary search
int i = 0, j = n, mid = 0;
while (i < j)
{
mid = (i + j) / 2;
if (arr[mid] == target)
return arr[mid];
/* If target is less
than array element,
then search in left */
if (target < arr[mid])
{
// If target is greater
// than previous to mid,
// return closest of two
if (mid > 0 && target > arr[mid - 1])
return getClosest(arr[mid - 1],
arr[mid], target);
/* Repeat for left half */
j = mid;
}
// If target is
// greater than mid
else
{
if (mid < n-1 && target < arr[mid + 1])
return getClosest(arr[mid],
arr[mid + 1], target);
i = mid + 1; // update i
}
}
// Only single element
// left after search
return arr[mid];
}
// Method to compare which one
// is the more close We find the
// closest by taking the difference
// between the target and both
// values. It assumes that val2 is
// greater than val1 and target
// lies between these two.
public static int getClosest(int val1, int val2,
int target)
{
if (target - val1 >= val2 - target)
return val2;
else
return val1;
}
// Driver code
public static void Main()
{
int []arr = {1, 2, 4, 5,
6, 6, 8, 9};
int target = 11;
Console.WriteLine(findClosest(arr, target));
}
}
// This code is contributed by anuj_67.
PHP
= $arr[$n - 1])
return $arr[$n - 1];
// Doing binary search
$i = 0;
$j = $n;
$mid = 0;
while ($i < $j)
{
$mid = ($i + $j) / 2;
if ($arr[$mid] == $target)
return $arr[$mid];
/* If target is less than array element,
then search in left */
if ($target < $arr[$mid])
{
// If target is greater than previous
// to mid, return closest of two
if ($mid > 0 && $target > $arr[$mid - 1])
return getClosest($arr[$mid - 1],
$arr[$mid], $target);
/* Repeat for left half */
$j = $mid;
}
// If target is greater than mid
else
{
if ($mid < $n - 1 &&
$target < $arr[$mid + 1])
return getClosest($arr[$mid],
$arr[$mid + 1], $target);
// update i
$i = $mid + 1;
}
}
// Only single element left after search
return $arr[$mid];
}
// Method to compare which one is the more close.
// We find the closest by taking the difference
// between the target and both values. It assumes
// that val2 is greater than val1 and target lies
// between these two.
function getClosest($val1, $val2, $target)
{
if ($target - $val1 >= $val2 - $target)
return $val2;
else
return $val1;
}
// Driver code
$arr = array( 1, 2, 4, 5, 6, 6, 8, 9 );
$n = sizeof($arr);
$target = 11;
echo (findClosest($arr, $n, $target));
// This code is contributed bu Sachin.
?>
输出:
9