A Sum Array Puzzle

Given an array arr[] of n integers, construct a Sum Array sum[] (of same size) such that sum[i] is equal to the sum of all the elements of arr[] except arr[i]. Solve it without subtraction operator and in O(n).

Examples:

Input : arr[] = {3, 6, 4, 8, 9}
Output : sum[] = {27, 24, 26, 22, 21}

Input : arr[] = {4, 5, 7, 3, 10, 1}
Output : sum[] = {26, 25, 23, 27, 20, 29}

Algorithm:
1) Construct a temporary array leftSum[] such that leftSum[i] contains sum of all elements on left of arr[i] excluding arr[i].
2) Construct another temporary array rightSum[] such that rightSum[i] contains sum of all elements on on right of arr[i] excluding arr[i].
3) To get sum[], sum left[] and right[].



C/C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
  
void sumArray(int arr[], int n)
{
    /* Allocate memory for temporary arrays leftSum[],
       rightSum[] and Sum[]*/
    int leftSum[n], rightSum[n], Sum[n], i, j;
  
    /* Left most element of left array is always 0 */
    leftSum[0] = 0;
  
    /* Rightmost most element of right 
       array is always 0 */
    rightSum[n - 1] = 0;
  
    /* Construct the left array*/
    for (i = 1; i < n; i++)
        leftSum[i] = arr[i - 1] + leftSum[i - 1];
  
    /* Construct the right array*/
    for (j = n - 2; j >= 0; j--)
        rightSum[j] = arr[j + 1] + rightSum[j + 1];
  
    /* Construct the sum array using 
        left[] and right[] */
    for (i = 0; i < n; i++)
        Sum[i] = leftSum[i] + rightSum[i];
  
    /* print the constructed prod array */
    for (i = 0; i < n; i++)
        cout << Sum[i] << " ";
}
  
/* Driver program to test above functions */
int main()
{
    int arr[] = { 3, 6, 4, 8, 9 };
    int n = sizeof(arr) / sizeof(arr[0]);
    sumArray(arr, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of above approach
import java.util.*;
import java.lang.*;
import java.io.*;
  
class Geeks {
    public static void sumArray(int arr[], int n)
    {
        /* Allocate memory for temporary arrays 
           leftSum[], rightSum[] and Sum[]*/
        int leftSum[] = new int[n];
        int rightSum[] = new int[n];
        int Sum[] = new int[n];
  
        int i = 0, j = 0;
  
        /* Left most element of left array is 
           always 0 */
        leftSum[0] = 0;
  
        /* Right most element of rght array 
           is always 0 */
        rightSum[n - 1] = 0;
  
        /* Construct the left array*/
        for (i = 1; i < n; i++)
            leftSum[i] = arr[i - 1] + leftSum[i - 1];
  
        /* Construct the right array*/
        for (j = n - 2; j >= 0; j--)
            rightSum[j] = arr[j + 1] + rightSum[j + 1];
  
        /* Construct the sum array using 
        left[] and right[] */
        for (i = 0; i < n; i++)
            Sum[i] = leftSum[i] + rightSum[i];
  
        /*print the sum array*/
        for (i = 0; i < n; i++)
            System.out.print(Sum[i] + " ");
    }
  
    /* Driver function to test above function*/
    public static void main(String[] args)
    {
        int arr[] = { 3, 6, 4, 8, 9 };
        int n = arr.length;
        sumArray(arr, n);
    }
}

chevron_right


Python3

# Python3 implementation of above approach

def sumArray(arr, n):

# Allocate memory for temporary arrays
# leftSum[], rightSum[] and Sum[]
leftSum = [0 for i in range(n)]
rightSum = [0 for i in range(n)]
Sum = [0 for i in range(n)]
i, j = 0, 0

# Left most element of left
# array is always 0
leftSum[0] = 0

# Rightmost most element of right
# array is always 0
rightSum[n – 1] = 0

# Construct the left array
for i in range(1, n):
leftSum[i] = arr[i – 1] + leftSum[i – 1]

# Construct the right array
for j in range(n – 2, -1, -1):
rightSum[j] = arr[j + 1] + rightSum[j + 1]

# Construct the sum array using
# left[] and right[]
for i in range(0, n):
Sum[i] = leftSum[i] + rightSum[i]

# print the constructed prod array
for i in range(n):
print(Sum[i], end = ” “)

# Driver Code
arr = [3, 6, 4, 8, 9]
n = len(arr)
sumArray(arr, n)



# This code is contributed by
# mohit kumar 29

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach
  
using System ;
  
class Geeks { 
    public static void sumArray(int []arr, int n) 
    
        /* Allocate memory for temporary arrays 
        leftSum[], rightSum[] and Sum[]*/
        int []leftSum = new int[n]; 
        int []rightSum = new int[n]; 
        int []Sum = new int[n]; 
  
        int i = 0, j = 0; 
  
        /* Left most element of left array is 
        always 0 */
        leftSum[0] = 0; 
  
        /* Right most element of rght array 
        is always 0 */
        rightSum[n - 1] = 0; 
  
        /* Construct the left array*/
        for (i = 1; i < n; i++) 
            leftSum[i] = arr[i - 1] + leftSum[i - 1]; 
  
        /* Construct the right array*/
        for (j = n - 2; j >= 0; j--) 
            rightSum[j] = arr[j + 1] + rightSum[j + 1]; 
  
        /* Construct the sum array using 
        left[] and right[] */
        for (i = 0; i < n; i++) 
            Sum[i] = leftSum[i] + rightSum[i]; 
  
        /*print the sum array*/
        for (i = 0; i < n; i++) 
            Console.Write(Sum[i] + " "); 
    
  
    /* Driver function to test above function*/
    public static void Main() 
    
        int []arr = { 3, 6, 4, 8, 9 }; 
        int n = arr.Length; 
        sumArray(arr, n); 
    
    // This code is contributed by Ryuga

chevron_right


Output:

27 24 26 22 21

Time Complexity: O(n)
Space Complexity: O(n)
Auxiliary Space: O(n)

The above method can be optimized to work in O(1) auxiliary space.

C/C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
  
void sumArray(int arr[], int n)
{
    int i, temp = 0;
  
    /* Allocate memory for the sum array */
    int Sum[n];
  
    /* Initialize the sum array as 0 */
    memset(Sum, 0, n);
  
    /* In this loop, temp variable contains 
       sum of elements on left side excluding
       arr[i] */
    for (i = 0; i < n; i++) {
        Sum[i] = temp;
        temp += arr[i];
    }
  
    /* Initialize temp to 0 for sum on right
       side */
    temp = 0;
  
    /* In this loop, temp variable contains
       sum of  elements on right side excluding
        arr[i] */
    for (i = n - 1; i >= 0; i--) {
        Sum[i] += temp;
        temp += arr[i];
    }
  
    for (i = 0; i < n; i++)
        cout << Sum[i] << " ";
}
  
/* Driver program to test above function */
int main()
{
    int arr[] = { 3, 6, 4, 8, 9 };
    int n = sizeof(arr) / sizeof(arr[0]);
    sumArray(arr, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of above approach
import java.util.*;
import java.lang.*;
import java.io.*;
  
class Geeks {
    public static void sumArray(int arr[], int n)
    {
        int i = 0, temp = 0;
        int Sum[] = new int[n];
  
        Arrays.fill(Sum, 0);
  
        /* In this loop, temp variable contains
           sum of elements on left side excluding
           arr[i] */
        for (i = 0; i < n; i++) {
            Sum[i] = temp;
            temp += arr[i];
        }
  
        /* Initialize temp to 0 for sum on right side */
        temp = 0;
  
        /* In this loop, temp variable contains
           sum of elements on right side excluding
           arr[i] */
        for (i = n - 1; i >= 0; i--) {
            Sum[i] += temp;
            temp += arr[i];
        }
  
        for (i = 0; i < n; i++)
            System.out.print(Sum[i] + " ");
    }
  
    /* Driver function to test above function*/
    public static void main(String[] args)
    {
        int arr[] = { 3, 6, 4, 8, 9 };
        int n = arr.length;
        sumArray(arr, n);
    }
}

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach
using System;
class Geeks {
    public static void sumArray(int []arr, int n)
    {
        int i = 0, temp = 0;
        int []Sum = new int[n];
        for( i=0;i<n;i++)
        Sum[i] = 0;
  
        /* In this loop, temp variable contains
        sum of elements on left side excluding
        arr[i] */
        for (i = 0; i < n; i++) {
            Sum[i] = temp;
            temp += arr[i];
        }
  
        /* Initialize temp to 0 for sum on right side */
        temp = 0;
  
        /* In this loop, temp variable contains
        sum of elements on right side excluding
        arr[i] */
        for (i = n - 1; i >= 0; i--) {
            Sum[i] += temp;
            temp += arr[i];
        }
  
        for (i = 0; i < n; i++)
            Console.Write(Sum[i] + " ");
    }
  
    /* Driver function to test above function*/
    public static void Main()
    {
        int []arr = { 3, 6, 4, 8, 9 };
        int n = arr.Length;
        sumArray(arr, n);
    }
}
// This code is contributed by inder_verma..

chevron_right


Output:

27 24 26 22 21

Time Complexity: O(n)
Auxiliary Space: O(1)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.