Find if array has an element whose value is half of array sum - GeeksforGeeks

23 Jul, 2021
Given a sorted array (with unique entries), we have to find whether there exist an element(say X) which is exactly half the sum of all the elements of the array including X.
Examples:  
Input : A = {1, 2, 3}
Output : YES
Sum of all the elements is 6 = 3*2;

Input : A = {2, 4}
Output : NO
Sum of all the elements is 6, and 3 is not present in the array.
1. Calculate the sum of all the elements of the array. 2. There can be two cases ....a. Sum is Odd, implies we cannot find such X, since all entries are integer. ....b. Sum is Even, if half the value of sum exist in array then answer is YES else NO. 3. We can use Binary Search to find if sum/2 exist in array or not (Since it does not have duplicate entries)
Below is the implementation of above approach:  
C++
Java
Python3
C#
PHP
Javascript
// CPP program to check if array has an// element whose value is half of array// sum.#include <bits/stdc++.h>using namespace std; // Function to check if answer existsbool checkForElement(int array[], int n){    // Sum of all array elements    int sum = 0;    for (int i = 0; i < n; i++)        sum += array[i];     // If sum is odd    if (sum % 2)       return false;     sum /= 2; // If sum is Even     // Do binary search for the required element    int start = 0;    int end = n - 1;    while (start <= end)    {        int mid = start + (end - start) / 2;        if (array[mid] == sum)            return true;               else if (array[mid] > sum)            end = mid - 1;               else            start = mid + 1;    }     return false;} // Driver codeint main(){    int array[] = { 1, 2, 3 };    int n = sizeof(array) / sizeof(array[0]);    if (checkForElement(array, n))      cout << "Yes";    else      cout << "No";    return 0;}
// Java program to check if array has an// element whose value is half of array// sum. import java.io.*; class GFG { // Function to check if answer existsstatic boolean checkForElement(int array[], int n){    // Sum of all array elements    int sum = 0;    for (int i = 0; i < n; i++)        sum += array[i];     // If sum is odd    if (sum % 2>0)    return false;     sum /= 2; // If sum is Even     // Do binary search for the required element    int start = 0;    int end = n - 1;    while (start <= end)    {        int mid = start + (end - start) / 2;        if (array[mid] == sum)            return true;            else if (array[mid] > sum)            end = mid - 1;            else            start = mid + 1;    }     return false;} // Driver code     public static void main (String[] args) {    int array[] = { 1, 2, 3 };    int n = array.length;    if (checkForElement(array, n))    System.out.println( "Yes");    else    System.out.println( "No");    }}// This code is contributed by anuj_67..
# Python 3 program to check if array# has an element whose value is half# of array sum. # Function to check if answer existsdef checkForElement(array, n):         # Sum of all array elements    sum = 0    for i in range(n):        sum += array[i]     # If sum is odd    if (sum % 2):        return False     sum //= 2     # If sum is Even     # Do binary search for the    # required element    start = 0    end = n - 1    while (start <= end) :        mid = start + (end - start) // 2        if (array[mid] == sum):            return True           elif (array[mid] > sum) :            end = mid - 1;            else:            start = mid + 1     return False # Driver codeif __name__ == "__main__":    array = [ 1, 2, 3 ]    n = len(array)    if (checkForElement(array, n)):        print("Yes")    else:        print("No") # This code is contributed# by ChitraNayal
// C# program to check if array has// an element whose value is half// of array sum.using System; class GFG{// Function to check if answer existsstatic bool checkForElement(int[] array,                            int n){    // Sum of all array elements    int sum = 0;    for (int i = 0; i < n; i++)        sum += array[i];     // If sum is odd    if (sum % 2 > 0)    return false;     sum /= 2; // If sum is Even     // Do binary search for the    // required element    int start = 0;    int end = n - 1;    while (start <= end)    {        int mid = start + (end - start) / 2;        if (array[mid] == sum)            return true;            else if (array[mid] > sum)            end = mid - 1;            else            start = mid + 1;    }     return false;} // Driver Codestatic void Main(){    int []array = { 1, 2, 3 };    int n = array.Length;    if (checkForElement(array, n))        Console.WriteLine("Yes");    else        Console.WriteLine("No");}} // This code is contributed by ANKITRAI1
<?php// PHP program to check if array has an// element whose value is half of array// sum. // Function to check if answer existsfunction checkForElement(&$array, $n){    // Sum of all array elements    $sum = 0;    for ($i = 0; $i < $n; $i++)        $sum += $array[$i];     // If sum is odd    if ($sum % 2)    return false;     $sum /= 2; // If sum is Even     // Do binary search for the    // required element    $start = 0;    $end = $n - 1;    while ($start <= $end)    {        $mid = $start + ($end - $start) / 2;        if ($array[$mid] == $sum)            return true;            else if ($array[$mid] > $sum)            $end = $mid - 1;            else            $start = $mid + 1;    }     return false;} // Driver code$array = array(1, 2, 3 );$n = sizeof($array);if (checkForElement($array, $n))    echo "Yes";else    echo "No";     // This code is contributed// by Shivi_Aggarwal?>
<script>// Javascript program to check if array has an// element whose value is half of array// sum. // Function to check if answer existsfunction checkForElement(array, n){     // Sum of all array elements    let sum = 0;    for (let i = 0; i < n; i++)        sum += array[i];     // If sum is odd    if (sum % 2)    return false;     sum = Math.floor(sum / 2); // If sum is Even     // Do binary search for the    // required element    let start = 0;    let end = n - 1;    while (start <= end)    {        let mid = Math.floor(start + (end - start) / 2);        if (array[mid] == sum)            return true;            else if (array[mid] > sum)            end = mid - 1;            else            start = mid + 1;    }     return false;} // Driver codelet array = new Array(1, 2, 3 );let n = array.length;if (checkForElement(array, n))    document.write("Yes");else    document.write("No");     // This code is contributed by _saurabh_jaiswal</script>
Yes
 
Time Complexity: O(n) Auxiliary Space: O(1)
Another efficient solution that works for unsorted arrays also The idea is to use hashing.  
C++
Java
Python3
C#
Javascript
// CPP program to check if array has an// element whose value is half of array// sum.#include <bits/stdc++.h>using namespace std; // Function to check if answer existsbool checkForElement(int array[], int n){    // Sum of all array elements    // and storing in a hash table    unordered_set<int> s;    int sum = 0;    for (int i = 0; i < n; i++) {        sum += array[i];        s.insert(array[i]);    }       // If sum/2 is present in hash table    if (sum % 2 == 0 && s.find(sum/2) != s.end())        return true;    else        return false;} // Driver codeint main(){    int array[] = { 1, 2, 3 };    int n = sizeof(array) / sizeof(array[0]);    if (checkForElement(array, n))      cout << "Yes";    else      cout << "No";    return 0;}
// Java program to check if array has an// element whose value is half of array// sum. import java.util.*; class GFG { // Function to check if answer exists    static boolean checkForElement(int array[], int n) {        // Sum of all array elements        // and storing in a hash table        Set<Integer> s = new LinkedHashSet<>();        int sum = 0;        for (int i = 0; i < n; i++) {            sum += array[i];            s.add(array[i]);        }        // If sum/2 is present in hash table        if (sum % 2 == 0 && s.contains(sum / 2)                && (sum / 2 )== s.stream().skip(s.size() - 1).findFirst().get()) {            return true;        } else {            return false;        }    } // Driver code    public static void main(String[] args) {        int array[] = {1, 2, 3};        int n = array.length;        System.out.println(checkForElement(array, n) ? "Yes" : "No");    }}// This code is contributed by 29AjayKumar
# Python 3 program to check if array has an# element whose value is half of array# sum. # Function to check if answer existsdef checkForElement(array, n):    # Sum of all array elements    # and storing in a hash table    s = set()    sum = 0    for i in range(n):        sum += array[i]        s.add(array[i])     # If sum/2 is present in hash table    f = int(sum / 2)    if (sum % 2 == 0 and  f in s):        return True    else:        return False # Driver codeif __name__ == '__main__':    array = [1, 2, 3]    n = len(array)    if (checkForElement(array, n)):        print("Yes")    else:        print("No") # This code is contributed by# Surendra_Gangwar
// C# program to check if array has an// element whose value is half of array// sum.using System;using System.Collections.Generic; class GFG{     // Function to check if answer exists    static Boolean checkForElement(int []array, int n)    {        // Sum of all array elements        // and storing in a hash table        HashSet<int> s = new HashSet<int>();        int sum = 0;        for (int i = 0; i < n; i++)        {            sum += array[i];            s.Add(array[i]);        }                 // If sum/2 is present in hash table        if (sum % 2 == 0 && s.Contains(sum / 2))        {            return true;        }        else        {            return false;        }    }     // Driver code    public static void Main(String[] args)    {        int []array = {1, 2, 3};        int n = array.Length;        Console.WriteLine(checkForElement(array, n) ? "Yes" : "No");    }} // This code is contributed by Princi Singh
<script> // Javascript program to check if array has an// element whose value is half of array// sum. // Function to check if answer existsfunction checkForElement(array, n){         // Sum of all array elements    // and storing in a hash table    let s = new Set();    let sum = 0;         for(let i = 0; i < n; i++)    {        sum += array[i];        s.add(array[i]);    }          // If sum/2 is present in hash table    if (sum % 2 == 0 && s.has(sum / 2))    {        return true;    }    else    {        return false;    }} // Driver codelet array = [ 1, 2, 3 ];let n = array.length; document.write(    checkForElement(array, n) ? "Yes" : "No"); // This code is contributed by rag2127 </script>
Yes
 
Time Complexity : O(n) Auxiliary Space : O(n) 
vt_m
ankthon
ukasp
Shivi_Aggarwal
29AjayKumar
SURENDRA_GANGWAR
princi singh
_saurabh_jaiswal
rag2127
Binary Search
cpp-unordered_set
Arrays
Hash
Arrays
Hash
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Linked List vs Array
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Internal Working of HashMap in Java
Count pairs with given sum
Hashing | Set 1 (Introduction)
Hashing | Set 3 (Open Addressing)