给定一个包含大小为N 的正整数和一个整数K的数组arr[] ,任务是使数组中的所有元素等于某个值D (D > 0)使得|arr[i] – D| ≤ K 。如果无法使数组相等,则打印D或-1的值。
例子:
Input: arr[] = {1, 2, 3, 4, 5}, K = 2
Output: 3
Explanation:
All the elements in the array can be made equal to 3 as:
|arr[0] – 3| = 2 ≤ 2
|arr[1] – 3| = 1 ≤ 2
|arr[2] – 3| = 0 ≤ 2
|arr[3] – 3| = 1 ≤ 2
|arr[4] – 3| = 2 ≤ 2
Input: arr[] = {1, 6, 20}, K = 1
Output: -1
Explanation:
It is not possible to equalize the array
方法:思路是先找到数组的最小元素。
- 如果M是数组的最小元素,则M + K是该最小元素为满足条件arr[i] – D ≤ K可以采用的最大可能值。
- 然后, D = M + K ,如果对于数组中的所有元素, (M + K) 位于[arr[i] – K, arr[i] + K] 范围内。
- 因此,我们只需遍历数组中的每个元素并检查这种情况。
下面是上述方法的实现:
C++
// C++ program to make all elements
// of an Array equal by adding or
// subtracting at most K
#include
using namespace std;
// Function to equalize the array by
// adding or subtracting at most K
// value from each element
int equalize(int arr[], int n, int k)
{
// Finding the minimum element
// from the array
int min_ele
= *min_element(arr, arr + n);
// Boolean variable to check if the
// array can be equalized or not
bool flag = true;
// Traversing the array
for (int i = 0; i < n; i++) {
// Checking if the values lie
// within the possible range
// for each element
if (!((arr[i] + k) >= min_ele + k
&& min_ele + k >= (arr[i] - k))) {
// If any value doesn't lie in
// the range then exit the loop
flag = false;
break;
}
}
if (flag) {
// Value after equalizing the array
return min_ele + k;
}
// Array cannot be equalized
else
return -1;
}
// Driver code
int main()
{
int K = 2;
int arr[] = { 1, 2, 3, 4, 5 };
int N = sizeof(arr) / sizeof(arr[0]);
cout << equalize(arr, N, K);
}
Java
// Java program to make all elements
// of an Array equal by adding or
// subtracting at most K
import java.util.*;
class GFG{
// Function to equalize the array by
// adding or subtracting at most K
// value from each element
static int equalize(int arr[], int n, int k)
{
// Finding the minimum element
// from the array
int min_ele
= Arrays.stream(arr).min().getAsInt();
// Boolean variable to check if the
// array can be equalized or not
boolean flag = true;
// Traversing the array
for (int i = 0; i < n; i++) {
// Checking if the values lie
// within the possible range
// for each element
if (!((arr[i] + k) >= min_ele + k
&& min_ele + k >= (arr[i] - k))) {
// If any value doesn't lie in
// the range then exit the loop
flag = false;
break;
}
}
if (flag) {
// Value after equalizing the array
return min_ele + k;
}
// Array cannot be equalized
else
return -1;
}
// Driver code
public static void main(String[] args)
{
int K = 2;
int arr[] = { 1, 2, 3, 4, 5 };
int N = arr.length;
System.out.print(equalize(arr, N, K));
}
}
// This code is contributed by Princi Singh
Python3
# Python program to make all elements
# of an Array equal by adding or
# subtracting at most K
# Function to equalize the array by
# adding or subtracting at most K
# value from each element
def equalize(arr, n, k):
# Finding the minimum element
# from the array
min_ele = min(arr);
# Boolean variable to check if the
# array can be equalized or not
flag = True;
# Traversing the array
for i in range(n):
# Checking if the values lie
# within the possible range
# for each element
if (not((arr[i] + k) >= (min_ele + k) and
(min_ele + k) >= (arr[i] - k))) :
# If any value doesn't lie in
# the range then exit the loop
flag = False;
break;
if (flag):
# Value after equalizing the array
return min_ele + k;
# Array cannot be equalized
else:
return -1;
# Driver code
if __name__=='__main__':
K = 2;
arr = [ 1, 2, 3, 4, 5] ;
N = len(arr)
print(equalize(arr, N, K))
# This code is contributed by Princi Singh
C#
// C# program to make all elements
// of an Array equal by adding or
// subtracting at most K
using System;
using System.Linq;
class GFG{
// Function to equalize the array by
// adding or subtracting at most K
// value from each element
static int equalize(int []arr, int n, int k)
{
// Finding the minimum element
// from the array
int min_ele = arr.Min();
// Boolean variable to check if the
// array can be equalized or not
bool flag = true;
// Traversing the array
for (int i = 0; i < n; i++) {
// Checking if the values lie
// within the possible range
// for each element
if (!((arr[i] + k) >= min_ele + k
&& min_ele + k >= (arr[i] - k))) {
// If any value doesn't lie in
// the range then exit the loop
flag = false;
break;
}
}
if (flag) {
// Value after equalizing the array
return min_ele + k;
}
// Array cannot be equalized
else
return -1;
}
// Driver code
public static void Main(String[] args)
{
int K = 2;
int []arr = { 1, 2, 3, 4, 5 };
int N = arr.Length;
Console.Write(equalize(arr, N, K));
}
}
// This code is contributed by Princi Singh
Javascript
输出:
3
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live