Skip to content
Related Articles

Related Articles

Improve Article
Find array elements equal to sum of any subarray of at least size 2
  • Difficulty Level : Medium
  • Last Updated : 24 May, 2021

Given an array arr[], the task is to find the elements from the array which are equal to the sum of any sub-array of size greater than 1.
Examples: 

Input: arr[] = {1, 2, 3, 4, 5, 6} 
Output: 3, 5, 6 
Explanation: 
The elements 3, 5, 6 are equal to sum of subarrays {1, 2},{2, 3} and {1, 2, 3} respectively.
Input: arr[] = {5, 6, 10, 1, 3, 4, 8, 16} 
Output: 4, 8, 16 
Explanation: 
The elements 4, 8, 16 are equal to the sum of subarrays {1, 3}, {1, 3, 4}, {1, 3, 4, 8} respectively 
 

Approach: The idea is to use a prefix sum array to solve the given problem. Create a prefix[] array that stores the prefix sum of all its preceding elements for every index. Store the sum of all subarrays in a map and search if any array element is present in the map or not.
Below is the implementation of the above approach: 
 

C++




// C++ implementation to find array
// elements equal to the sum
// of any subarray of at least size 2
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find all elements
void findElements(int* arr, int n)
{
    if (n == 1)
        return;
 
    int pre[n];
 
    // Create a prefix array
    pre[0] = arr[0];
 
    for (int i = 1; i < n; i++)
        pre[i] = arr[i] + pre[i - 1];
 
    unordered_map<int, bool> mp;
 
    // Mark the sum of all sub arrays as true
    for (int i = 1; i < n - 1; i++) {
        mp[pre[i]] = true;
 
        for (int j = i + 1; j < n; j++) {
            mp[pre[j] - pre[i - 1]] = true;
        }
    }
 
    // Check all elements
    // which are marked
    // true in the map
    for (int i = 0; i < n; i++) {
        if (mp[arr[i]]) {
            cout << arr[i] << " ";
        }
    }
    cout << endl;
}
 
// Driver Code
int main()
{
    int arr1[] = { 1, 2, 3, 4, 5, 6 };
 
    int n1 = sizeof(arr1) / sizeof(arr1[0]);
 
    findElements(arr1, n1);
 
    return 0;
}

Java




// Java implementation to find array
// elements equal to the sum of any
// subarray of at least size 2
import java.util.*;
 
class GFG{
     
// Function to find all elements
static void findElements(int[] arr, int n)
{
    if (n == 1)
        return;
 
    int pre[] = new int[n];
 
    // Create a prefix array
    pre[0] = arr[0];
 
    for(int i = 1; i < n; i++)
        pre[i] = arr[i] + pre[i - 1];
 
    HashMap<Integer, Boolean> mp = new HashMap<>();
 
    // Mark the sum of all sub arrays as true
    for(int i = 1; i < n - 1; i++)
    {
        mp.put(pre[i], true);
 
        for(int j = i + 1; j < n; j++)
        {
            mp.put(pre[j] - pre[i - 1], true);
        }
    }
 
    // Check all elements
    // which are marked
    // true in the map
    for(int i = 0; i < n; i++)
    {
        if (mp.get(arr[i]) != null)
        {
            System.out.print(arr[i] + " ");
        }
    }
    System.out.println();
}
 
// Driver Code
public static void main(String[] args)
{
    int arr1[] = { 1, 2, 3, 4, 5, 6 };
 
    int n1 = arr1.length;
 
    findElements(arr1, n1);
}
}
 
// This code is contributed by jrishabh99

Python3




# Python3 implementation to find array
# elements equal to the sum of any
# subarray of at least size 2
 
# Function to find all elements
def findElements(arr, n):
 
    if (n == 1):
        return;
 
    pre = [0] * n;
 
    # Create a prefix array
    pre[0] = arr[0];
 
    for i in range(1, n):
        pre[i] = arr[i] + pre[i - 1];
 
    mp = {};
 
    # Mark the sum of all sub arrays as true
    for i in range(1, n - 1):
        mp[pre[i]] = True;
 
        for j in range(i + 1, n):
            mp[pre[j] - pre[i - 1]] = True;
 
    # Check all elements which
    # are marked true in the map
    for i in range(n):
        if arr[i] in mp:
            print(arr[i], end = " ");
        else:
            pass
     
    print()
 
# Driver Code
if __name__ == "__main__":
 
    arr1 = [ 1, 2, 3, 4, 5, 6 ];
    n1 = len(arr1);
 
    findElements(arr1, n1);
     
# This code is contributed by AnkitRai01

C#




// C# implementation to find array
// elements equal to the sum of any
// subarray of at least size 2
using System;
using System.Collections.Generic;
class GFG{
     
// Function to find all elements
static void findElements(int[] arr,
                         int n)
{
  if (n == 1)
    return;
 
  int []pre = new int[n];
 
  // Create a prefix array
  pre[0] = arr[0];
 
  for(int i = 1; i < n; i++)
    pre[i] = arr[i] + pre[i - 1];
 
  Dictionary<int,
             Boolean> mp = new Dictionary<int,
                                          Boolean>();
 
  // Mark the sum of all sub arrays as true
  for(int i = 1; i < n - 1; i++)
  {
    if(!mp.ContainsKey(pre[i]))
      mp.Add(pre[i], true);
 
    for(int j = i + 1; j < n; j++)
    {
      if(!mp.ContainsKey(pre[j] - pre[i - 1]))
        mp.Add(pre[j] - pre[i - 1], true);
    }
  }
 
  // Check all elements
  // which are marked
  // true in the map
  for(int i = 0; i < n; i++)
  {
    if (mp.ContainsKey(arr[i]))
    {
      Console.Write(arr[i] + " ");
    }
  }
  Console.WriteLine();
}
 
// Driver Code
public static void Main(String[] args)
{
  int []arr1 = {1, 2, 3, 4, 5, 6};
  int n1 = arr1.Length;
  findElements(arr1, n1);
}
}
 
// This code is contributed by gauravrajput1

Javascript




<script>
 
// Javascript implementation to find array
// elements equal to the sum of any
// subarray of at least size 2
 
// Function to find all elements
function findElements(arr, n)
{
    if (n == 1)
        return;
  
    let pre = Array.from({length: n}, (_, i) => 0);
  
    // Create a prefix array
    pre[0] = arr[0];
  
    for(let i = 1; i < n; i++)
        pre[i] = arr[i] + pre[i - 1];
  
    let mp = new Map();
  
    // Mark the sum of all sub arrays as true
    for(let i = 1; i < n - 1; i++)
    {
        mp.set(pre[i], true);
  
        for(let j = i + 1; j < n; j++)
        {
            mp.set(pre[j] - pre[i - 1], true);
        }
    }
  
    // Check all elements
    // which are marked
    // true in the map
    for(let i = 0; i < n; i++)
    {
        if (mp.get(arr[i]) != null)
        {
            document.write(arr[i] + " ");
        }
    }
    document.write("<br/>");
}
 
// Driver code
     
      let arr1 = [ 1, 2, 3, 4, 5, 6 ];
  
    let n1 = arr1.length;
  
    findElements(arr1, n1);
  
 // This code is contributed by souravghosh0416.
</script>
Output: 
3 5 6

 

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 industry experts, please refer DSA Live Classes 




My Personal Notes arrow_drop_up
Recommended Articles
Page :