Given an array arr[] of integers, change the array such that at every index i it becomes the sum of all elements except itself. Simple way arr[i] should be arr[0] + arr[1] ... arr[i-1] + arr[i+1] ... arr[n-1].
Examples:
Input: arr[] = [3, 6, 4, 8, 9]
Output: 27, 24, 26, 22, 21
Explanation: For the sum array,
at i = 0 we have 6+4+8+9.
At i = 1, 3+4+8+9. At i=2,
We have 3+6+8+9.
At i = 3, we have 3+6+4+9.
At i = 4, we have 3+6+4+8.
So S is 27 24 26 22 21.
Input: arr[] = [0, 0, 1]
Output: 1, 1, 0
Explanation: For the sum array,
At i = 0 sum = 0 + 1 = 1,
At i = 1 sum = 0 + 1 = 1,
At i = 2 sum = 0 + 0 = 0.
Table of Content
[Naive Approach] Using Brute Force - O(n^2) Time O(n) Space
The idea is to traverse the array and for every index and calculate the sum of all elements except the current element. Store these sums in a temporary array and copy them back to the original array.
#include <bits/stdc++.h>
using namespace std;
int sumArray(vector<int> &arr)
{
int n = arr.size();
vector<int> sum(n, 0);
// Calculate sum for every index
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i != j)
{
sum[i] += arr[j];
}
}
}
// Store answer back in original array
for (int i = 0; i < n; i++)
{
arr[i] = sum[i];
}
return 0;
}
// Driver code
int main()
{
vector<int> arr = {3, 6, 4, 8, 9};
sumArray(arr);
for (int x : arr)
{
cout << x << " ";
}
return 0;
}
import java.util.*;
public class GfG {
public static int sumArray(List<Integer> arr)
{
int n = arr.size();
int[] sum = new int[n];
// Calculate sum for every index
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j) {
sum[i] += arr.get(j);
}
}
}
// Store answer back in original list
for (int i = 0; i < n; i++) {
arr.set(i, sum[i]);
}
return 0;
}
public static void main(String[] args)
{
List<Integer> arr = new ArrayList<>(
Arrays.asList(3, 6, 4, 8, 9));
sumArray(arr);
for (int x : arr) {
System.out.print(x + " ");
}
}
}
def sumArray(arr):
n = len(arr)
sum = [0] * n
# Calculate sum for every index
for i in range(n):
for j in range(n):
if i != j:
sum[i] += arr[j]
# Store answer back in original array
for i in range(n):
arr[i] = sum[i]
return 0
if __name__ == "__main__":
arr = [3, 6, 4, 8, 9]
sumArray(arr)
for x in arr:
print(x, end=' ')
using System;
public class GfG
{
public static int sumArray(int[] arr)
{
int n = arr.Length;
int[] sum = new int[n];
// Calculate sum for every index
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i!= j)
{
sum[i] += arr[j];
}
}
}
// Store answer back in original array
for (int i = 0; i < n; i++)
{
arr[i] = sum[i];
}
return 0;
}
public static void Main()
{
int[] arr = {3, 6, 4, 8, 9};
sumArray(arr);
foreach (int x in arr)
{
Console.Write(x + " ");
}
}
}
function sumArray(arr) {
let n = arr.length;
let sum = Array(n).fill(0);
// Calculate sum for every index
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i!= j) {
sum[i] += arr[j];
}
}
}
// Store answer back in original array
for (let i = 0; i < n; i++) {
arr[i] = sum[i];
}
return 0;
}
// Driver code
let arr = [3, 6, 4, 8, 9];
sumArray(arr);
for (let x of arr) {
process.stdout.write(x + ' ');
}
Output
27 24 26 22 21
Time Complexity: O(n^2)
Auxiliary Space: O(n)
[Better Approach] Using Prefix Sum and Suffix Sum - O(n) Time O(n) Space
The idea is to precompute the sum of elements on the left and right side of every index using two arrays
leftSum[]andrightSum[]. Then for each index, add both values to get the sum of all elements except the current element.
#include <bits/stdc++.h>
using namespace std;
int sumArray(vector<int> &arr)
{
int n = arr.size();
vector<int> leftSum(n, 0);
vector<int> rightSum(n, 0);
// Store left side sums
for (int i = 1; i < n; i++)
{
leftSum[i] = leftSum[i - 1] + arr[i - 1];
}
// Store right side sums
for (int i = n - 2; i >= 0; i--)
{
rightSum[i] = rightSum[i + 1] + arr[i + 1];
}
// Final answer
for (int i = 0; i < n; i++)
{
arr[i] = leftSum[i] + rightSum[i];
}
return 0;
}
// Driver code
int main()
{
vector<int> arr = {3, 6, 4, 8, 9};
sumArray(arr);
for (int x : arr)
{
cout << x << " ";
}
return 0;
}
import java.util.*;
public class GfG {
public static void sumArray(List<Integer> arr) {
int n = arr.size();
int[] leftSum = new int[n];
int[] rightSum = new int[n];
// Store left side sums
for (int i = 1; i < n; i++) {
leftSum[i] = leftSum[i - 1] + arr.get(i - 1);
}
// Store right side sums
for (int i = n - 2; i >= 0; i--) {
rightSum[i] = rightSum[i + 1] + arr.get(i + 1);
}
// Final answer
for (int i = 0; i < n; i++) {
arr.set(i, leftSum[i] + rightSum[i]);
}
}
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>(Arrays.asList(3, 6, 4, 8, 9));
sumArray(arr);
for (int x : arr) {
System.out.print(x + " ");
}
}
}
def sumArray(arr):
n = len(arr)
leftSum = [0] * n
rightSum = [0] * n
# Store left side sums
for i in range(1, n):
leftSum[i] = leftSum[i - 1] + arr[i - 1]
# Store right side sums
for i in range(n - 2, -1, -1):
rightSum[i] = rightSum[i + 1] + arr[i + 1]
# Final answer
for i in range(n):
arr[i] = leftSum[i] + rightSum[i]
return 0
# Driver code
if __name__ == "__main__":
arr = [3, 6, 4, 8, 9]
sumArray(arr)
for x in arr:
print(x, end=' ')
using System;
public class GfG
{
static void sumArray(int[] arr)
{
int n = arr.Length;
int[] leftSum = new int[n];
int[] rightSum = new int[n];
// Store left side sums
for (int i = 1; i < n; i++)
{
leftSum[i] = leftSum[i - 1] + arr[i - 1];
}
// Store right side sums
for (int i = n - 2; i >= 0; i--)
{
rightSum[i] = rightSum[i + 1] + arr[i + 1];
}
// Final answer
for (int i = 0; i < n; i++)
{
arr[i] = leftSum[i] + rightSum[i];
}
}
public static void Main()
{
int[] arr = { 3, 6, 4, 8, 9 };
sumArray(arr);
foreach (int x in arr)
{
Console.Write(x + " ");
}
}
}
function sumArray(arr) {
const n = arr.length;
const leftSum = new Array(n).fill(0);
const rightSum = new Array(n).fill(0);
// Store left side sums
for (let i = 1; i < n; i++) {
leftSum[i] = leftSum[i - 1] + arr[i - 1];
}
// Store right side sums
for (let i = n - 2; i >= 0; i--) {
rightSum[i] = rightSum[i + 1] + arr[i + 1];
}
// Final answer
for (let i = 0; i < n; i++) {
arr[i] = leftSum[i] + rightSum[i];
}
return 0;
}
// Driver code
const arr = [3, 6, 4, 8, 9];
sumArray(arr);
arr.forEach(x => console.log(x + " "));
Output
27 24 26 22 21
Time Complexity: O(n)
Auxiliary Space: O(n)
[Expected Approach] Using Total Sum - O(n) Time and O(1) Space
The idea is to first calculate the total sum of all array elements. Then for every index, replace
arr[i]withtotalSum - arr[i], which gives the sum of all elements except the current element.
#include <bits/stdc++.h>
using namespace std;
int sumArray(vector<int> &arr)
{
int n = arr.size();
int totalSum = 0;
// Calculate total sum
for (int i = 0; i < n; i++)
{
totalSum += arr[i];
}
// Replace every element
for (int i = 0; i < n; i++)
{
arr[i] = totalSum - arr[i];
}
return 0;
}
// Driver code
int main()
{
vector<int> arr = {3, 6, 4, 8, 9};
sumArray(arr);
for (int x : arr)
{
cout << x << " ";
}
return 0;
}
import java.util.*;
public class GfG {
static void sumArray(List<Integer> arr) {
int n = arr.size();
int totalSum = 0;
// Calculate total sum
for (int i = 0; i < n; i++) {
totalSum += arr.get(i);
}
// Replace every element
for (int i = 0; i < n; i++) {
arr.set(i, totalSum - arr.get(i));
}
}
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>(Arrays.asList(3, 6, 4, 8, 9));
sumArray(arr);
for (int x : arr) {
System.out.print(x + " ");
}
}
}
def sumArray(arr):
n = len(arr)
totalSum = 0
# Calculate total sum
for i in range(n):
totalSum += arr[i]
# Replace every element
for i in range(n):
arr[i] = totalSum - arr[i]
return 0
# Driver code
if __name__ == "__main__":
arr = [3, 6, 4, 8, 9]
sumArray(arr)
for x in arr:
print(x, end=' ')
using System;
class GfG {
static void sumArray(int[] arr) {
int n = arr.Length;
int totalSum = 0;
// Calculate total sum
for (int i = 0; i < n; i++) {
totalSum += arr[i];
}
// Replace every element
for (int i = 0; i < n; i++) {
arr[i] = totalSum - arr[i];
}
}
static void Main() {
int[] arr = { 3, 6, 4, 8, 9 };
sumArray(arr);
foreach (int x in arr) {
Console.Write(x + " ");
}
}
}
function sumArray(arr) {
let n = arr.length;
let totalSum = 0;
// Calculate total sum
for (let i = 0; i < n; i++) {
totalSum += arr[i];
}
// Replace every element
for (let i = 0; i < n; i++) {
arr[i] = totalSum - arr[i];
}
}
// Driver code
let arr = [3, 6, 4, 8, 9];
sumArray(arr);
console.log(arr.join(' '));
Output
27 24 26 22 21
Time Complexity: O(n)
Auxiliary Space: O(1)