Find original Array from given Array where each element is sum of prefix and postfix sum
Last Updated :
06 Nov, 2023
Given an array arr[] of length N, where arr is derived from an array nums[] which is lost. Array arr[] is derived as:
arr[i] = (nums[0] + nums[1] + … + nums[i]) + (nums[i] + nums[i+1] + … + nums[N-1]).
The task is to find nums[] array of length N.
Examples:
Input: N = 4, arr[] = {9, 10, 11, 10}
Output: {1, 2, 3, 2}
Explanation: If nums[] = {1, 2, 3, 2}, then according to above definition
arr[0] = (nums[0]) + (nums[0] + nums[1] + nums[2] + nums[3]) = 1 + 1 + 2 + 3 + 2 = 9
arr[1] = (nums[0] + nums[1]) + (nums[1] + nums[2] + nums[3]) = 1 + 2 + 2 + 3 + 2 = 10
arr[2] = (nums[0] + nums[1] + nums[2]) + (nums[2] + nums[3]) = 1 + 2 + 3 + 3 + 2 = 11
arr[3] = (nums[0] + nums[1] + nums[2] + nums[3]) + (nums[3]) = 1 + 2 + 3 + 2 + 2 = 10
Input: N = 2, arr[] = [25, 20]
Output: [10, 5]
Approach: Follow the below idea to solve the problem:
Suppose nums[] contains [a1, a2, a3, …, aN]
Then, sum = a1 + a2 + a3 + . . . + aN.
We are given
b1 = a1 + a1 + a2 + . . . + aN = a1 + sum …..(1)
Similarly,
b2 = a1 + a2 + a2 + . . . + aN = a2 + sum …..(2)
. . . (so on) and in last
b1 = a1 + a2 + a3 + . . . + aN + aN = aN + sum …..(N)
where [b1, b2, b3 , . . ., bN] are elements of arr[] and,
total = b1 + b2 + b3 + . . . + bN
Adding all equation (1) + (2) + (3) + …. + (N) we will get
b1 + b2 + b3 + . . . + bN = (a1 + sum) + (a2 + sum) + . . . + (aN + sum)
total = (a1 + a1 + a2 + . . . + aN) + (N * sum)
total = (sum) + (N * sum)
total = (N + 1) * sum
Now find the value of sum variable after that simply:
a1 = (b1 – sum), a2 = (b2 – sum), . . ., aN = (bN – sum)
Using the above idea follow the below steps to implement the code:
- First of all, try to store the sum of elements of arr[] in a variable let’s say total
- Using the formula (N + 1) * sum = total, we will get the value of variable sum which denotes the sum of elements present in the nums[] array.
- At last traverse N times to find nums[0] = arr[0] – sum, nums[1] = arr[1] – sum and so on.
- Return the array and print it.
Below is the implementation of the above approach:
C++
#include <iostream>
#include <vector>
using namespace std;
vector< int > findOrgArray(vector< int > arr, int N)
{
int total = 0;
for ( int val : arr)
total += val;
int sum = (total / (N + 1));
vector< int > v;
for ( int i = 0; i < N; i++) {
int val = arr[i] - sum;
v.push_back(val);
}
return v;
}
int main()
{
int N = 4;
vector< int > arr = { 9, 10, 11, 10 };
vector< int > v = findOrgArray(arr, N);
for ( auto val : v)
cout << val << " " ;
return 0;
}
|
Java
import java.util.*;
class GFG {
public static void main(String[] args)
{
int N = 4 ;
int [] arr = { 9 , 10 , 11 , 10 };
List<Integer> nums = findOrgArray(arr, N);
for ( int x : nums)
System.out.print(x + " " );
}
public static List<Integer> findOrgArray( int [] arr,
int N)
{
int total = 0 ;
for ( int val : arr)
total += val;
int sum = (total / (N + 1 ));
List<Integer> nums = new ArrayList<>();
for ( int i = 0 ; i < N; i++) {
int val = arr[i] - sum;
nums.add(val);
}
return nums;
}
}
|
Python3
def findOrgArray(arr, N) :
total = 0
for i in arr :
total + = i
sum = int (total / (N + 1 ));
v = []
for i in range (N) :
val = arr[i] - sum
v.append(val)
return v
if __name__ = = "__main__" :
N = 4
arr = [ 9 , 10 , 11 , 10 ]
v = findOrgArray(arr, N)
for val in v :
print (val,end = ' ' )
|
C#
using System;
using System.Collections.Generic;
public class GFG
{
public static List< int > findOrgArray( int [] arr,
int N)
{
int total = 0;
foreach ( int val in arr)
total += val;
int sum = (total / (N + 1));
List< int > nums = new List< int >();
for ( int i = 0; i < N; i++) {
int val = arr[i] - sum;
nums.Add(val);
}
return nums;
}
public static void Main(String []args)
{
int N = 4;
int [] arr = { 9, 10, 11, 10 };
List< int > nums = findOrgArray(arr, N);
for ( int x = 0; x < nums.Count; x++)
Console.Write(nums[x] + " " );
}
}
|
Javascript
<script>
function findOrgArray(arr, N)
{
let total = 0;
for (let i = 0; i < N; i++)
total += arr[i];
let sum = (total / (N + 1));
let v= new Array(N);
for (let i = 0; i < N; i++) {
v[i] = arr[i] - sum;
}
return v;
}
let N = 4;
let arr = [ 9, 10, 11, 10 ];
let v = findOrgArray(arr, N);
for (let i = 0; i < N; i++)
document.write(v[i]+ " " );
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N), to further reduce it to O(1), store the value in the same given array arr[] rather than storing it in a new array.
Another Approach:
- Initialize a variable named “total” to 0.
- Traverse the input array “arr” using a range-based for loop.
a. For each element “val” in “arr”, add “val” to the “total” variable.
- Compute the sum of the original array “nums” using the formula: sum = total / (N + 1).
- Traverse the input array “arr” again using a for loop with index “i” from 0 to N-1.
a. For each element in “arr”, subtract “sum” from it and store the result back into “arr[i]”. This effectively undoes the modification made to “arr” and recovers the original array “nums”.
Below is the implementation of the above approach:
C++
#include <iostream>
#include <vector>
using namespace std;
void findOrgArray(vector< int >& arr, int N)
{
int total = 0;
for ( int val : arr)
total += val;
int sum = (total / (N + 1));
for ( int i = 0; i < N; i++) {
arr[i] = arr[i] - sum;
}
}
int main()
{
int N = 4;
vector< int > arr = { 9, 10, 11, 10 };
findOrgArray(arr, N);
for ( auto val : arr)
cout << val << " " ;
return 0;
}
|
Java
import java.util.*;
import java.io.*;
public class GFG {
static void findOrgArray(List<Integer> arr, int N) {
int total = 0 ;
for ( int val : arr) {
total += val;
}
int sum = total / (N + 1 );
for ( int i = 0 ; i < N; i++) {
arr.set(i, arr.get(i) - sum);
}
}
public static void main(String[] args) {
int N = 4 ;
List<Integer> arr = new ArrayList<>();
arr.add( 9 );
arr.add( 10 );
arr.add( 11 );
arr.add( 10 );
findOrgArray(arr, N);
for ( int val : arr) {
System.out.print(val + " " );
}
}
}
|
Python3
def find_org_array(arr, N):
total = 0
for val in arr:
total + = val
sum = int (total / (N + 1 ))
for i in range (N):
arr[i] - = sum
return arr
arr = [ 9 , 10 , 11 , 10 ]
n = 4
arr = find_org_array(arr,n)
for val in arr:
print (val,end = " " )
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void FindOrgArray(List< int > arr, int N)
{
int total = 0;
foreach ( int val in arr)
total += val;
int sum = total / (N + 1);
for ( int i = 0; i < N; i++)
{
arr[i] = arr[i] - sum;
}
}
static void Main()
{
int N = 4;
List< int > arr = new List< int > { 9, 10, 11, 10 };
FindOrgArray(arr, N);
foreach ( var val in arr)
Console.Write(val + " " );
}
}
|
Javascript
function findOrgArray(arr, N) {
let total = 0;
for (let val of arr) {
total += val;
}
let sum = Math.floor(total / (N + 1));
for (let i = 0; i < N; i++) {
arr[i] = arr[i] - sum;
}
}
let N = 4;
let arr = [9, 10, 11, 10];
findOrgArray(arr, N);
for (let val of arr) {
console.log(val + " " );
}
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Similar Reads
Find the original Array from given array where ith element is the average of first i elements
Given an array arr[] of length N, the task is to find the original array such that every ith element in the given array(arr[i]) is the average value of the first i elements of the original array. Examples: Input: arr = {4 3 3 3} Output: 4 2 3 3Explanation: (4) / 1 = 1, (4+2) / 2 = 3, (4+2+3) / 3 = 3
5 min read
Find original array from encrypted array (An array of sums of other elements)
Find original array from a given encrypted array of size n. Encrypted array is obtained by replacing each element of the original array by the sum of the remaining array elements. Examples : Input : arr[] = {10, 14, 12, 13, 11} Output : {5, 1, 3, 2, 4} Original array {5, 1, 3, 2, 4} Encrypted array
6 min read
Find original array from given array which is obtained after P prefix reversals | Set-2
Given an array arr[] of size N and an integer P, the task is to find the original array from the array obtained by P prefix reversals where in ith reversal the prefix of size i of the array containing indices in range [0, i-1] was reversed. Note: P is less than or equal to N Examples: Input: arr[] =
7 min read
Find the suffix factorials of a suffix sum array of the given array
Given an array arr[] consisting of N positive integers, the task is to find the suffix factorials of a suffix sum array of the given array. Examples: Input: arr[] = {1, 2, 3, 4}Output: {3628800, 362880, 5040, 24}Explanation: The suffix sum of the given array is {10, 9, 7, 4}. Therefore, suffix facto
5 min read
Find the lexicographically largest array containing all distinct elements from each prefix of the given array
Given an array arr[] of length N. The task is to find a lexicographically largest array res[] of the same length such that each prefix of res[] includes all distinct elements present in the corresponding prefix of array arr[]. Examples: Input: N = 6, arr[] = {2, 5, 3, 2, 6, 5}Output: res[] = {2, 5,
7 min read
Count of possible arrays from prefix-sum and suffix-sum arrays
Given 2*N integers which are elements of a prefix and suffix array(in shuffled order) of an array of size N, the task is to find the no of possible array's of the size N which can be made from these elements Examples: Input: arr[] = {5, 2, 3, 5} Output: 2 Explanation: 1st array can be : {2, 3} Its p
15+ min read
Find an element in array such that sum of left array is equal to sum of right array
Given, an array of size n. Find an element that divides the array into two sub-arrays with equal sums. Examples: Input: 1 4 2 5 0Output: 2Explanation: If 2 is the partition, subarrays are : [1, 4] and [5] Input: 2 3 4 1 4 5Output: 1Explanation: If 1 is the partition, Subarrays are : [2, 3, 4] and [4
15+ min read
Find position forming AP with prefix and suffix sum of Array with common difference D
Given an array, arr[] of size N and a positive integer D, the task is to find the position i of an element in arr[] such that the prefix sum, arr[i] and suffix sum is in arithmetic progression with common difference D, i.e. arr[i] - sum(arr[0, . . ., i-1]) = sum(arr[i+1, . . ., N-1]) - arr[i] = D. I
8 min read
Find the Initial Array from given array after range sum queries
Given an array arr[] which is the resultant array when a number of queries are performed on the original array. The queries are of the form [l, r, x] where l is the starting index in the array, r is the ending index in the array and x is the integer elements that have to be added to all the elements
13 min read
Find K for every Array element such that at least K prefixes are ≥ K
Given an array arr[] consisting of N non-negative integers, the task is to find an integer K for every index such that at least K integers in the array till that index are greater or equal to K. Note: Consider 1-based indexing Examples: Input: arr[] = {3, 0, 6, 1, 5} Output: K = {1, 1, 2, 2, 3} Expl
7 min read