# 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}

## Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.

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++

 `// C++ implementation of above approach ` `#include ` `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; ` ` `  `    ``/* 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); ` `    ``sumArray(arr, n); ` ` `  `    ``return` `0; ` `} `

## Java

 `// 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); ` `    ``} ` `} `

## 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#

 `// 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;  ` ` `  `        ``/* 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 ` `}  `

## PHP

 `= 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``++) ` `        ``echo` `\$Sum``[``\$i``].``" "``; ` `} ` ` `  `// Driver Code ` `\$arr` `= ``array``( 3, 6, 4, 8, 9 ); ` `\$n` `= ``count``(``\$arr``); ` `sumArray(``\$arr``, ``\$n``); ` ` `  `// This code is contributed ` `// by chandan_jnu ` `?> `

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++

 `// C++ implementation of above approach ` `#include ` `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); ` `    ``sumArray(arr, n); ` ` `  `    ``return` `0; ` `} `

## Java

 `// 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); ` `    ``} ` `} `

## Python3

 `# Python3 implementation of above approach ` `def` `sumArray(arr, n): ` ` `  `    ``i, temp ``=` `0``, ``0` ` `  `    ``# Allocate memory for the sum array */ ` `    ``Sum` `=` `[``0` `for` `i ``in` `range``(n)] ` ` `  `    ``'''In this loop, temp variable contains  ` `    ``sum of elements on left side excluding ` `    ``arr[i] '''` `    ``for` `i ``in` `range``(n): ` `        ``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 ``in` `range``(n ``-` `1``, ``-``1``, ``-``1``): ` `        ``Sum``[i] ``+``=` `temp ` `        ``temp ``+``=` `arr[i] ` `     `  `    ``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#

 `// 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= 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.. `

## PHP

 `= 0; ``\$i``--)  ` `    ``{ ` `        ``\$Sum``[``\$i``] += ``\$temp``; ` `        ``\$temp` `+= ``\$arr``[``\$i``]; ` `    ``} ` ` `  `    ``for` `(``\$i` `= 0; ``\$i` `< ``\$n``; ``\$i``++) ` `        ``echo` `\$Sum``[``\$i``] . ``" "``; ` `} ` ` `  `// Driver Code ` `\$arr` `= ``array``( 3, 6, 4, 8, 9 ); ` `\$n` `= ``count``(``\$arr``); ` `sumArray(``\$arr``, ``\$n``); ` ` `  `// This code is contributed by ` `// chandan_jnu ` `?> `

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.

Article Tags :
Practice Tags :

1

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