Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmMinimum value of X to make all array elements equal by either...

Minimum value of X to make all array elements equal by either decreasing or increasing by X

Given an array of N elements and you can perform two operations on it:

  • Increase any of the array element by X once.
  • Decrease any of the array element by X once.

The task is to find the minimum most value of X such that all array elements are equal by either applying operation 1, 2 or not applying any operation. If all the array elements cannot be made equal, then print -1.

Examples:

Input: a[] = {1, 4, 4, 7, 4, 1}
Output: 3
Increase the first and last element by 3.
Decrease the fourth element by 3.

Input: {1, 5, 7, 9, 1}
Output: -1

  • Increase any of the array element by X once.
  • Decrease any of the array element by X once.
  • If there are 3 unique elements, if abs(el2-el1) == abs(el3-el2), then the answer is abs(el2-el1). If they are not equal then the answer is -1.
  • If there are 2 unique elements, the answer is (el2 – el1) / 2, if el2 – el1 is even, else the answer is (el2 – el1)
  • If there is a single unique element, then the answer is 0

Below is the implementation of the above approach:

C++




// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function that returns the
// minimum value of X
int findMinimumX(int a[], int n)
{
 
    // Declare a set
    set<int> st;
 
    // Iterate in the array element
    // and insert them into the set
    for (int i = 0; i < n; i++)
        st.insert(a[i]);
 
    // If unique elements is 1
    if (st.size() == 1)
        return 0;
 
    // Unique elements is 2
    if (st.size() == 2) {
        // Get both el2 and el1
        int el1 = *st.begin();
        int el2 = *st.rbegin();
 
        // Check if they are even
        if ((el2 - el1) % 2 == 0)
            return (el2 - el1) / 2;
        else
            return (el2 - el1);
    }
 
    // If there are 3 unique elements
    if (st.size() == 3) {
        // Get three unique elements
        auto it = st.begin();
        int el1 = *it;
        it++;
        int el2 = *it;
        it++;
        int el3 = *it;
 
        // Check if their difference is same
        if ((el2 - el1) == (el3 - el2))
            return el2 - el1;
        else
            return -1;
    }
 
    // More than 3 unique elements
    return -1;
}
 
// Driver code
int main()
{
    int a[] = { 1, 4, 4, 7, 4, 1 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << findMinimumX(a, n);
 
    return 0;
}


Java




// Java implementation of the approach
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
 
class GFG
{
     
    // Function that returns the
    // minimum value of X
    static int findMinimumX(int a[], int n)
    {
 
        // Declare a set
        Set<Integer> st = new HashSet<>();
 
        // Iterate in the array element
        // and insert them into the set
        for (int i = 0; i < n; i++)
            st.add(a[i]);
 
        // If unique elements is 1
        if (st.size() == 1)
            return 0;
 
        // Unique elements is 2
        if (st.size() == 2)
        {
            // Get both el2 and el1
            Iterator<Integer> it = st.iterator();
            int el1 = it.next();
            int el2 = it.next();
 
            // Check if they are even
            if ((el2 - el1) % 2 == 0)
                return (el2 - el1) / 2;
            else
                return (el2 - el1);
        }
 
        // If there are 3 unique elements
        if (st.size() == 3)
        {
            // Get three unique elements
            Iterator<Integer> it = st.iterator();
            int el1 = it.next();
            int el2 = it.next();
            int el3 = it.next();
 
            // Check if their difference is same
            if ((el2 - el1) == (el3 - el2))
                return el2 - el1;
            else
                return -1;
        }
 
        // More than 3 unique elements
        return -1;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int a[] = {1, 4, 4, 7, 4, 1};
        int n = a.length;
        System.out.println(findMinimumX(a, n));
    }
}
 
// This code is contributed by
// Rajnis09


Python3




# Python 3 program to implement
# the above approach
 
# Function that returns the
# minimum value of X
def findMinimumX(a, n):
     
    # Declare a set
    st = set()
 
    # Iterate in the array element
    # and insert them into the set
    for i in range(n):
        st.add(a[i])
 
    # If unique elements is 1
    if (len(st) == 1):
        return 0
 
    # Unique elements is 2
    if (len(st) == 2):
         
        # Get both el2 and el1
        st = list(st)
        el1 = st[0]
        el2 = st[1]
 
        # Check if they are even
        if ((el2 - el1) % 2 == 0):
            return int((el2 - el1) / 2)
        else:
            return (el2 - el1)
 
    # If there are 3 unique elements
    if (len(st) == 3):
        st = list(st)
         
        # Get three unique elements
        el1 = st[0]
        el2 = st[1]
        el3 = st[2]
 
        # Check if their difference is same
        if ((el2 - el1) == (el3 - el2)):
            return el2 - el1
        else:
            return -1
 
    # More than 3 unique elements
    return -1
 
# Driver code
if __name__ == '__main__':
    a = [1, 4, 4, 7, 4, 1]
    n = len(a)
    print(findMinimumX(a, n))
 
# This code is contributed by
# Surendra_Gangwar


C#




// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
     
    // Function that returns the
    // minimum value of X
    static int findMinimumX(int []a, int n)
    {
 
        // Declare a set
        List<int> st = new List<int>();
 
        // Iterate in the array element
        // and insert them into the set
        for (int i = 0; i < n; i++)
            if(!st.Contains(a[i]))
                st.Add(a[i]);
 
        // If unique elements is 1
        if (st.Count == 1)
            return 0;
 
        // Unique elements is 2
        if (st.Count == 2)
        {
            // Get both el2 and el1
            int el1 = st[0];
            int el2 = st[1];
 
            // Check if they are even
            if ((el2 - el1) % 2 == 0)
                return (el2 - el1) / 2;
            else
                return (el2 - el1);
        }
 
        // If there are 3 unique elements
        if (st.Count == 3)
        {
            // Get three unique elements
            int el1 = st[0];
            int el2 = st[1];
            int el3 = st[2];
 
            // Check if their difference is same
            if ((el2 - el1) == (el3 - el2))
                return el2 - el1;
            else
                return -1;
        }
 
        // More than 3 unique elements
        return -1;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int []a = {1, 4, 4, 7, 4, 1};
        int n = a.Length;
        Console.WriteLine(findMinimumX(a, n));
    }
}
     
// This code is contributed by Princi Singh


Javascript




// JavaScript program to implement
// the above approach
 
// Function that returns the
// minimum value of X
function findMinimumX(a, n)
{
    // Declare a set
    let st = new Set()
 
    // Iterate in the array element
    // and insert them into the set
    for (var i = 0; i < n; i++)
        st.add(a[i])
     
    st = Array.from(st)
    st.sort()
 
    // If unique elements is 1
    if (st.length == 1)
        return 0
 
    // Unique elements is 2
    if (st.length == 2)
    {
        // Get both el2 and el1
         
        let el1 = st[0]
        let el2 = st[1]
 
        // Check if they are even
        if ((el2 - el1) % 2 == 0)
            return Math.floor((el2 - el1) / 2)
        else
            return (el2 - el1)
    }
     
    // If there are 3 unique elements
    if (st.length == 3)
    {
 
        // Get three unique elements
        let el1 = st[0]
        let el2 = st[1]
        let el3 = st[2]
 
        // Check if their difference is same
        if ((el2 - el1) == (el3 - el2))
            return el2 - el1
        else
            return -1
    }
 
    // More than 3 unique elements
    return -1
}
 
 
// Driver code
let a = [1, 4, 4, 7, 4, 1]
let n = a.length
console.log(findMinimumX(a, n))
 
 
// This code is contributed by
// phasing17


Output

3
Time complexity  O(nlogn).
Space complexity O(n),because it creates a set of unique elements that could potentially contain all n elements in the input array. 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Nicole Veronica Rubhabha
Nicole Veronica Rubhabha
A highly competent and organized individual DotNet developer with a track record of architecting and developing web client-server applications. Recognized as a personable, dedicated performer who demonstrates innovation, communication, and teamwork to ensure quality and timely project completion. Expertise in C#, ASP.Net, MVC, LINQ, EF 6, Web Services, SQL Server, MySql, Web development,
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments