Skip to content
Related Articles

Related Articles

Improve Article

Minimum increments to make all array elements equal with sum same as the given array after exactly one removal

  • Last Updated : 27 May, 2021

Given an array arr[] of size N and an integer K, the task is to check if all array elements can be made equal by removing an array element and incrementing the value of all other array elements such that the total sum of the array elements remains the same. If found to be true, then print “YES”. Otherwise, print “NO”.

Examples :

Input: arr[] = { 2, 2, 2, 3 } 
Output: YES 
Explanation: 
Removing arr[2] ( 0-based indexing ) from the array and incrementing all other elements by 1 modifies arr[] to { 3, 3, 3 } 
Since all array elements are equal. Therefore, the required output is “YES”.

Input: arr[] = { 0, 3, 0 }, K = 3 
Output:: NO 
Removing arr[1] ( 0-based indexing ) from the array and incrementing the value arr[0] by 1 and arr[2] by 2 modifies arr[] to { 1, 2 } 
Since all array elements are not equal. Therefore, the required output is “NO”.

Approach: The problem can be solved using Greedy technique. The idea is to remove the largest array element and increment the value of other elements such that the total sum remains same. Follow the steps below to solve the problem:



Below is the implementation of above approach

C++




// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if an array of
// equal elements with sum equal to
// the given array can be obtained or not
bool CheckAllarrayEqual(int arr[], int N)
{
    // Base case
    if (N == 1) {
        return true;
    }
 
    // Stores sum of
    // array elements
    int totalSum = arr[0];
 
    // Stores second largest
    // array element
    int secMax = INT_MIN;
 
    // Stores the largest
    // array element
    int Max = arr[0];
 
    // Traverse the array
    for (int i = 1; i < N; i++) {
 
        if (arr[i] >= Max) {
 
            // Update secMax
            secMax = Max;
 
            // Update Max
            Max = arr[i];
        }
        else if (arr[i] > secMax) {
 
            // Update secMax
            secMax = arr[i];
        }
 
        // Update totalSum
        totalSum += arr[i];
    }
 
    // If totalSum is less than
    // secMax * (N - 1))
    if ((secMax * (N - 1)) > totalSum) {
 
        return false;
    }
 
    // If totalSum is not
    // divisible by (N - 1)
    if (totalSum % (N - 1)) {
 
        return false;
    }
 
    return true;
}
 
// Driver Code
int main()
{
    int arr[] = { 6, 2, 2, 2 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    if (CheckAllarrayEqual(arr, N)) {
        cout << "YES";
    }
    else {
        cout << "NO";
    }
}

Java




// Java program to implement
// the above approach
import java.util.*;
    
class GFG{
 
// Function to check if an array of
// equal elements with sum equal to
// the given array can be obtained or not
static boolean CheckAllarrayEqual(int[] arr,
                                  int N)
{
     
    // Base case
    if (N == 1)
    {
        return true;
    }
   
    // Stores sum of
    // array elements
    int totalSum = arr[0];
   
    // Stores second largest
    // array element
    int secMax = Integer.MIN_VALUE;
   
    // Stores the largest
    // array element
    int Max = arr[0];
   
    // Traverse the array
    for(int i = 1; i < N; i++)
    {
        if (arr[i] >= Max)
        {
             
            // Update secMax
            secMax = Max;
             
            // Update Max
            Max = arr[i];
        }
        else if (arr[i] > secMax)
        {
             
            // Update secMax
            secMax = arr[i];
        }
         
        // Update totalSum
        totalSum += arr[i];
    }
   
    // If totalSum is less than
    // secMax * (N - 1))
    if ((secMax * (N - 1)) > totalSum)
    {
        return false;
    }
   
    // If totalSum is not
    // divisible by (N - 1)
    if (totalSum % (N - 1) != 0)
    {
        return false;
    }
   
    return true;
}
    
// Driver Code
public static void main(String[] args)
{
    int[] arr = { 6, 2, 2, 2 };
    int N = arr.length;
   
    if (CheckAllarrayEqual(arr, N))
    {
        System.out.print("YES");
    }
    else
    {
        System.out.print("NO");
    }
}
}
 
// This code is contributed by susmitakundugoaldanga

Python3




# Python3 program to implement
# the above approach
 
# Function to check if an array of
# equal elements with sum equal to
# the given array can be obtained or not
def CheckAllarrayEqual(arr, N):
     
    # Base case
    if (N == 1):
        return True
 
    # Stores sum of
    # array elements
    totalSum = arr[0]
 
    # Stores second largest
    # array element
    secMax = -10**19
 
    # Stores the largest
    # array element
    Max = arr[0]
 
    # Traverse the array
    for i in range(1,N):
 
        if (arr[i] >= Max):
 
            # Update secMax
            secMax = Max
 
            # Update Max
            Max = arr[i]
        elif (arr[i] > secMax):
 
            # Update secMax
            secMax = arr[i]
 
        # Update totalSum
        totalSum += arr[i]
 
    # If totalSum is less than
    # secMax * (N - 1))
    if ((secMax * (N - 1)) > totalSum):
 
        return False
 
    # If totalSum is not
    # divisible by (N - 1)
    if (totalSum % (N - 1)):
        return False
    return True
 
# Driver Code
if __name__ == '__main__':
    arr=[6, 2, 2, 2]
    N = len(arr)
 
    if (CheckAllarrayEqual(arr, N)):
        print("YES")
    else:
        print("NO")
 
        # This code is contributed by mohit kumar 29

C#




// C# program to implement
// the above approach 
using System;
class GFG
{
  
// Function to check if an array of
// equal elements with sum equal to
// the given array can be obtained or not
static bool CheckAllarrayEqual(int[] arr, int N)
{
    // Base case
    if (N == 1) {
        return true;
    }
  
    // Stores sum of
    // array elements
    int totalSum = arr[0];
  
    // Stores second largest
    // array element
    int secMax = Int32.MinValue;
  
    // Stores the largest
    // array element
    int Max = arr[0];
  
    // Traverse the array
    for (int i = 1; i < N; i++) {
  
        if (arr[i] >= Max) {
  
            // Update secMax
            secMax = Max;
  
            // Update Max
            Max = arr[i];
        }
        else if (arr[i] > secMax) {
  
            // Update secMax
            secMax = arr[i];
        }
  
        // Update totalSum
        totalSum += arr[i];
    }
  
    // If totalSum is less than
    // secMax * (N - 1))
    if ((secMax * (N - 1)) > totalSum) {
  
        return false;
    }
  
    // If totalSum is not
    // divisible by (N - 1)
    if (totalSum % (N - 1) != 0) {
  
        return false;
    }
  
    return true;
}
  
// Driver Code
public static void Main()
{
    int[] arr = { 6, 2, 2, 2 };
    int N = arr.Length;
  
    if (CheckAllarrayEqual(arr, N)) {
        Console.Write("YES");
    }
    else {
        Console.Write("NO");
    }
}
}
 
// This code is contributed by sanjoy_62

Javascript




<script>
 
// JavaScript program to implement
// the above approach
 
 
// Function to check if an array of
// equal elements with sum equal to
// the given array can be obtained or not
function CheckAllarrayEqual(arr,N)
{
     
    // Base case
    if (N == 1)
    {
        return true;
    }
 
    // Stores sum of
    // array elements
    let totalSum = arr[0];
 
    // Stores second largest
    // array element
    let secMax = Number.MIN_VALUE;
 
    // Stores the largest
    // array element
    let Max = arr[0];
 
    // Traverse the array
    for(let i = 1; i < N; i++)
    {
        if (arr[i] >= Max)
        {
             
            // Update secMax
            secMax = Max;
             
            // Update Max
            Max = arr[i];
        }
        else if (arr[i] > secMax)
        {
             
            // Update secMax
            secMax = arr[i];
        }
         
        // Update totalSum
        totalSum += arr[i];
    }
 
    // If totalSum is less than
    // secMax * (N - 1))
    if ((secMax * (N - 1)) > totalSum)
    {
        return false;
    }
 
    // If totalSum is not
    // divisible by (N - 1)
    if (totalSum % (N - 1) != 0)
    {
        return false;
    }
 
    return true;
}
     
// Driver Code
 
    let arr = [ 6, 2, 2, 2 ];
    let N = arr.length;
 
    if (CheckAllarrayEqual(arr, N))
    {
        document.write("YES");
    }
    else
    {
        document.write("NO");
    }
 
 
// This code is contributed by sravan kumar Gottumukkala
 
</script>
Output: 
YES

 

Time complexity: O(N) 
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :