Check if array elements can become same using one external number
Last Updated :
05 Nov, 2024
Given an array arr[] consisting of N integers and following are the three operations that can be performed using any external number X:
- Add X to an array element once.
- Subtract X from an array element once.
- Perform no operation on the array element.
The task is to check whether there exists a number X, such that if the above operations are performed with the number X, the array elements become equal. If the number exists, print "Yes" and the value of X. Otherwise, print "No".
Examples:
Input: arr[] = {2, 3, 3, 4, 2}
Output: Yes 1
Explanation:
Consider the value of X as 1 and increment the array element arr[0](= 2) and arr[4](= 2) by 1, and decrement arr[3](= 4) by 1 modifies the array to {3, 3, 3, 3, 3}.
Therefore, print Yes with the value X as 1.
Input: arr[] = {4, 3, 2, 1}
Output: No
The given problem can be solved based on the following observations:
- If all numbers are equal, the answer is "YES".
- If there are two distinct numbers in the array, the answer is "YES", as every distinct number can be converted to another integer by either adding the difference to smaller numbers or subtracting the difference from the larger numbers.
- If there are three distinct numbers A < B < C, then all array elements can be made equal by incrementing all the As by B - A and decrementing all the Cs by C - A only when (B - A) = (C - B) or B equals (C + A) / 2.
- If there are more than 3 distinct numbers in the array, the answer is "NO", because of the property of the addition.
We have already discussed a hash set based solution with O(n) time and O(n) space. In this post, a better solution with O(n) Time and O(1) Space is discussed.
Follow the steps below to solve the problem:
- Initialize 3 variables, say, X, Y, and Z as -1 to store all the 3 distinct integers of the array arr[].
- Traverse the given array arr[] using the variable i and perform the following steps:
- If any of X, Y, and Z are -1 then assign arr[i] to that variable.
- Otherwise, if none of the X, Y, and Z are equal to arr[i], then print "NO" and return.
- If any one of X, Y, and Z is equal to -1, then print "YES".
- Store the smallest element in X, the next largest element in Y, and the largest element in Z.
- Now, if Z-Y is equal to (Y - X), then print "YES". Otherwise, print "NO".
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find whether it is possible
// to make array elements equal using
// one external number
void isPossMakeThemEqual(int arr[],
int N)
{
int X = -1;
int Y = -1;
int Z = -1;
// Traverse the array arr[]
for (int i = 0; i < N; i++) {
// If X is equal to -1
if (X == -1) {
// Update the value of X
X = arr[i];
}
// Otherwise, if X is not
// equal to arr[i]
else if (X != arr[i]) {
// If Y is equal to -1
if (Y == -1) {
// Update Y
Y = arr[i];
}
// Otherwise, if Y is not
// equal to arr[i]
else if (Y != arr[i]) {
// If Z is equal to -1
if (Z == -1) {
// Update the value
// of Z
Z = arr[i];
}
// Otherwise If Z is not
// equal to arr[i], then
// there are at least four
// distinct numbers in array
else if (Z != arr[i]) {
cout << "NO";
return;
}
}
}
}
// If Y is equal to -1, then all
// the array elements are equal
if (Y == -1) {
cout << "YES 0";
return;
}
// If Z is equal to -1, then there
// are only two distinct elements
if (Z == -1) {
cout << "YES " << abs(X - Y);
return;
}
int a = X, b = Y, c = Z;
X = min(a, min(b, c));
Z = max(a, max(b, c));
Y = a + b + c - X - Z;
// If Y - X is not equal to Z - Y
if (Y - X != Z - Y) {
cout << "NO";
return;
}
// Finally print "Yes"
cout << "Yes " << (Y - X);
}
// Driver Code
int main()
{
int arr[] = { 2, 3, 3, 4, 2 };
int N = sizeof(arr) / sizeof(arr[0]);
isPossMakeThemEqual(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG {
// Function to find whether it is possible
// to make array elements equal using
// one external number
static void isPossMakeThemEqual(int arr[],
int N)
{
int X = -1;
int Y = -1;
int Z = -1;
// Traverse the array arr[]
for (int i = 0; i < N; i++) {
// If X is equal to -1
if (X == -1) {
// Update the value of X
X = arr[i];
}
// Otherwise, if X is not
// equal to arr[i]
else if (X != arr[i]) {
// If Y is equal to -1
if (Y == -1)
{
// Update Y
Y = arr[i];
}
// Otherwise, if Y is not
// equal to arr[i]
else if (Y != arr[i]) {
// If Z is equal to -1
if (Z == -1) {
// Update the value
// of Z
Z = arr[i];
}
// Otherwise If Z is not
// equal to arr[i], then
// there are at least four
// distinct numbers in array
else if (Z != arr[i]) {
System.out.println("NO");
return;
}
}
}
}
// If Y is equal to -1, then all
// the array elements are equal
if (Y == -1) {
System.out.println("YES 0");
return;
}
// If Z is equal to -1, then there
// are only two distinct elements
if (Z == -1) {
System.out.println("YES "+ Math.abs(X - Y));
return;
}
int a = X, b = Y, c = Z;
X = Math.min(a, Math.min(b, c));
Z = Math.max(a, Math.max(b, c));
Y = a + b + c - X - Z;
// If Y - X is not equal to Z - Y
if (Y - X != Z - Y) {
System.out.println("NO");
return;
}
// Finally print "Yes"
System.out.println("Yes "+(Y - X));
}
// Driver Code
public static void main (String[] args)
{
int arr[] = { 2, 3, 3, 4, 2 };
int N =arr.length;
isPossMakeThemEqual(arr, N);
}
}
// This code is contributed by Potta Lokesh
Python
# Python 3 program for the above approach
# Function to find whether it is possible
# to make array elements equal using
# one external number
def isPossMakeThemEqual(arr, N):
X = -1
Y = -1
Z = -1
# Traverse the array arr[]
for i in range(N):
# If X is equal to -1
if (X == -1):
# Update the value of X
X = arr[i]
# Otherwise, if X is not
# equal to arr[i]
elif (X != arr[i]):
# If Y is equal to -1
if (Y == -1):
# Update Y
Y = arr[i]
# Otherwise, if Y is not
# equal to arr[i]
elif (Y != arr[i]):
# If Z is equal to -1
if (Z == -1):
# Update the value
# of Z
Z = arr[i]
# Otherwise If Z is not
# equal to arr[i], then
# there are at least four
# distinct numbers in array
elif (Z != arr[i]):
print("NO")
return
# If Y is equal to -1, then all
# the array elements are equal
if (Y == -1):
print("YES 0")
return
# If Z is equal to -1, then there
# are only two distinct elements
if (Z == -1):
print("YES ",abs(X - Y))
return
a = X
b = Y
c = Z
X = min(a, min(b, c))
Z = max(a, max(b, c))
Y = a + b + c - X - Z
# If Y - X is not equal to Z - Y
if (Y - X != Z - Y):
print("NO")
return
# Finally print "Yes"
print("Yes ",(Y - X))
# Driver Code
if __name__ == '__main__':
arr = [2, 3, 3, 4, 2]
N = len(arr)
isPossMakeThemEqual(arr, N)
# This code is contributed by bgangwar59.
C#
// C# program for above approach
using System;
class GFG{
// Function to find whether it is possible
// to make array elements equal using
// one external number
static void isPossMakeThemEqual(int[] arr,
int N)
{
int X = -1;
int Y = -1;
int Z = -1;
// Traverse the array arr[]
for (int i = 0; i < N; i++) {
// If X is equal to -1
if (X == -1) {
// Update the value of X
X = arr[i];
}
// Otherwise, if X is not
// equal to arr[i]
else if (X != arr[i]) {
// If Y is equal to -1
if (Y == -1)
{
// Update Y
Y = arr[i];
}
// Otherwise, if Y is not
// equal to arr[i]
else if (Y != arr[i]) {
// If Z is equal to -1
if (Z == -1) {
// Update the value
// of Z
Z = arr[i];
}
// Otherwise If Z is not
// equal to arr[i], then
// there are at least four
// distinct numbers in array
else if (Z != arr[i]) {
Console.Write("NO");
return;
}
}
}
}
// If Y is equal to -1, then all
// the array elements are equal
if (Y == -1) {
Console.Write("YES 0");
return;
}
// If Z is equal to -1, then there
// are only two distinct elements
if (Z == -1) {
Console.Write("YES "+ Math.Abs(X - Y));
return;
}
int a = X, b = Y, c = Z;
X = Math.Min(a, Math.Min(b, c));
Z = Math.Max(a, Math.Max(b, c));
Y = a + b + c - X - Z;
// If Y - X is not equal to Z - Y
if (Y - X != Z - Y) {
Console.Write("NO");
return;
}
// Finally print "Yes"
Console.Write("Yes "+(Y - X));
}
// Driver Code
public static void Main(String[] args)
{
int[] arr = { 2, 3, 3, 4, 2 };
int N =arr.Length;
isPossMakeThemEqual(arr, N);
}
}
// This code is contributed by mukesh07.
JavaScript
<script>
// JavaScript Program for the above approach
// Function to find whether it is possible
// to make array elements equal using
// one external number
function isPossMakeThemEqual(arr, N)
{
let X = -1;
let Y = -1;
let Z = -1;
// Traverse the array arr[]
for (let i = 0; i < N; i++) {
// If X is equal to -1
if (X == -1) {
// Update the value of X
X = arr[i];
}
// Otherwise, if X is not
// equal to arr[i]
else if (X != arr[i]) {
// If Y is equal to -1
if (Y == -1)
{
// Update Y
Y = arr[i];
}
// Otherwise, if Y is not
// equal to arr[i]
else if (Y != arr[i]) {
// If Z is equal to -1
if (Z == -1) {
// Update the value
// of Z
Z = arr[i];
}
// Otherwise If Z is not
// equal to arr[i], then
// there are at least four
// distinct numbers in array
else if (Z != arr[i]) {
document.write("NO");
return;
}
}
}
}
// If Y is equal to -1, then all
// the array elements are equal
if (Y == -1) {
document.write("YES 0");
return;
}
// If Z is equal to -1, then there
// are only two distinct elements
if (Z == -1) {
document.write("YES "+ Math.abs(X - Y));
return;
}
let a = X, b = Y, c = Z;
X = Math.min(a, Math.min(b, c));
Z = Math.max(a, Math.max(b, c));
Y = a + b + c - X - Z;
// If Y - X is not equal to Z - Y
if (Y - X != Z - Y) {
document.write("NO");
return;
}
// Finally print "Yes"
document.write("Yes "+(Y - X));
}
// Driver Code
let arr = [ 2, 3, 3, 4, 2 ];
let N =arr.length;
isPossMakeThemEqual(arr, N);
// This code is contributed by sanjoy_62.
</script>
Time Complexity: O(N)
Auxiliary Space: O(1)
Similar Reads
Check if Array Elements can be Made Equal with Given Operations Given an array arr[] consisting of N integers and following are the three operations that can be performed using any external number X. Add X to an array element once.Subtract X from an array element once.Perform no operation on the array element.Note : Only one operation can be performed on a numbe
6 min read
Check if Array elements can be made equal by adding unit digit to the number Given an array arr[] of N integers, the task is to check whether it is possible to make all the array elements identical by applying the following option any number of times: Choose any number and add its unit digit to it. Examples: Input: arr[] = {1, 2, 4, 8, 24}Output: PossibleExplanation: For 1:
7 min read
Check if Arrays can be made equal by Replacing elements with their number of Digits Given two arrays A[] and B[] of length N, the task is to check if both arrays can be made equal by performing the following operation at most K times: Choose any index i and either change Ai to the number of digits Ai have or change Bi to the number of digits Bi have. Examples: Input: N = 4, K = 1,
10 min read
Check whether it is possible to make both arrays equal by modifying a single element Given two sequences of integers 'A' and 'B', and an integer 'k'. The task is to check if we can make both sequences equal by modifying any one element from the sequence A in the following way: We can add any number from the range [-k, k] to any element of A. This operation must only be performed onc
11 min read
Check if two arrays can be made equal by reversing any subarray once Given two arrays A[] and B[] of equal size N, the task is to check whether A[] can be made equal to B[] by reversing any sub-array of A only once. Examples: Input: A[] = {1, 3, 2, 4} B[] = {1, 2, 3, 4} Output: Yes Explanation: The sub-array {3, 2} can be reversed to {2, 3}, which makes A equal to B.
8 min read
Check if all the digits of the given number are same Given a positive integer N, the task is to check whether all the digits of the given integer N are the same or not. If found to be true, then print Yes. Otherwise, print No. Examples: Input: N = 222Output: Yes Input: N = 232Output: No Recommended: Please try your approach on {IDE} first, before movi
11 min read