Find whether it is possible to make array elements same using one external number

Given an Array, three operations can be performed using any external number x.

  1. Add x to an element once
  2. Subtract x from an element once
  3. Perform no operation on the element
  4. Find whether there exists a number X, such that if the above operations are performed with the number X, the resulting array has equal elements.
    If the number exists, print “YES” and the value, space separated, else print “NO”

    Examples:



    Input : [1, 1, 3, 5, 5]
    Output : YES, x = 2
    Explanation : The number 2 can be added to the 
    first two elements and can be subtracted from 
    the last two elements to obtain a common element
    3 throughout the array
    
    
    Input : [1, 3, 5, 7, 9]
    Output : NO
    

    The idea is to form groups of unique elements from given array. Following cases arise :

    1. Count of unique elements is 1. Answer is YES with x = 0
    2. Count of unique elements is 2. Answer is YES with x = Difference of two unique elements.
    3. Count of unique elements is 3.
      • If difference between mid and max is same as difference between mid and min, answer is YES with x = difference between mid and max or mid and min.
      • Otherwise answer is NO.

    In Python, we can quickly find unique elements using set in Python.

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # Program in python 2.x to find an element X
    # that can be used to operate on an array and
    # get equal elements
      
    # Prints "YES" and an element x if we can
    # equalize array using x. Else prints "NO"
    def canEqualise(array):
      
        # We all the unique elements (using set
        # function). Then we sort unique elements.
        uniques = sorted(set(array))
      
        # if there are only 1 or 2 unique elements,
        # then we can add or subtract x from one of them
        # to get the other element
        if len(uniques) == 1:
            print("YES " + "0")
        elif len(uniques) == 2:
            print("YES " + str(uniques[1] - uniques[0]))
      
        # If count of unique elements is three, then
        # difference between the middle and minimum
        # should be same as difference between maximum
        # and middle
        elif len(uniques) == 3:
            if uniques[2] - uniques[1] == uniques[1] - uniques[0]:
                X = uniques[2] - uniques[1]
                print("YES " + str(X))
            else:
                print("NO")
      
        # if there are more than three unique elements, then
        # we cannot add or subtract the same value from all
        # the elements.
        else:
            print("NO")
      
    # Driver code
    array = [55, 52, 52, 49, 52]
    canEqualise(array)

    chevron_right

    
    

    Output:

    YES 3
    

    This code has complexity O(n log n)
    The same problem could be extended to ask for two numbers required to equalize the array. Following the same process, we would require 5 unique elements in the array to require two numbers to equalize the array. So to require n numbers to equalize an array, we would require (2n + 1) unique elements in the array.

    This article is contributed by Deepak Srivatsav. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

    Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



    My Personal Notes arrow_drop_up


    Article Tags :
    Practice Tags :


    Be the First to upvote.


    Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.