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++
// C++ Algorithm for the above approach
#include <iostream>
#include <vector>
using namespace std;
// Function to find the original
// array nums[]
vector<int> findOrgArray(vector<int> arr, int N)
{
// Total variable stores the sum of
// elements of arr[]
int total = 0;
for (int val : arr)
total += val;
// Sum variable stores the sum of
// elements of nums[]
int sum = (total / (N + 1));
vector<int> v;
// Traversing to find the elements
// of nums[]
for (int i = 0; i < N; i++) {
int val = arr[i] - sum;
v.push_back(val);
}
// Returning nums[]
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
// Java algorithm of the above approach
import java.util.*;
class GFG {
// Driver Code
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 + " ");
}
// Function to find the original
// array nums[]
public static List<Integer> findOrgArray(int[] arr,
int N)
{
// Total variable stores the sum of
// elements of arr[]
int total = 0;
for (int val : arr)
total += val;
// Sum variable stores the sum of
// elements of nums[]
int sum = (total / (N + 1));
List<Integer> nums = new ArrayList<>();
// Traversing to find the elements
// of nums[]
for (int i = 0; i < N; i++) {
int val = arr[i] - sum;
nums.add(val);
}
// Returning nums[]
return nums;
}
}
Python3
# python3 Algorithm for the above approach
# Function to find the original
# array nums[]
def findOrgArray(arr, N) :
# Total variable stores the sum of
# elements of arr[]
total = 0
for i in arr :
total+= i
# Sum variable stores the sum of
# elements of nums[]
sum = int(total / (N + 1));
v = []
# Traversing to find the elements
# of nums[]
for i in range (N) :
val = arr[i] - sum
v.append(val)
# Returning nums[]
return v
# Driver Code
if __name__ == "__main__" :
N = 4
arr = [ 9, 10, 11, 10 ]
v = findOrgArray(arr, N)
for val in v :
print(val,end=' ')
# this code is contributed by aditya942003patil
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
public class GFG
{
// Function to find the original
// array nums[]
public static List<int> findOrgArray(int[] arr,
int N)
{
// Total variable stores the sum of
// elements of arr[]
int total = 0;
//for (int x = 0; x < arr.count; x++)
foreach (int val in arr)
total += val;
// Sum variable stores the sum of
// elements of nums[]
int sum = (total / (N + 1));
List<int> nums = new List<int>();
// Traversing to find the elements
// of nums[]
for (int i = 0; i < N; i++) {
int val = arr[i] - sum;
nums.Add(val);
}
// Returning nums[]
return nums;
}
// Driver Code
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] + " ");
}
}
// This code is contributed by sanjoy_62.
JavaScript
<script>
// Function to find the original
// array nums[]
function findOrgArray(arr, N)
{
// Total variable stores the sum of
// elements of arr[]
let total = 0;
for (let i = 0; i < N; i++)
total += arr[i];
// Sum variable stores the sum of
// elements of nums[]
let sum = (total / (N + 1));
let v= new Array(N);
// Traversing to find the elements
// of nums[]
for (let i = 0; i < N; i++) {
v[i] = arr[i] - sum;
}
// Returning nums[]
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]+ " ");
// This code is contributed by satwik4409.
</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;
// Function to find the original array nums[]
void findOrgArray(vector<int>& arr, int N)
{
// Total variable stores the sum of elements of arr[]
int total = 0;
for (int val : arr)
total += val;
// Sum variable stores the sum of elements of nums[]
int sum = (total / (N + 1));
// Traversing to find the elements of nums[]
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 {
// Function to find the original array nums[]
static void findOrgArray(List<Integer> arr, int N) {
// Total variable stores the sum of elements of arr[]
int total = 0;
for (int val : arr) {
total += val;
}
// Sum variable stores the sum of elements of nums[]
int sum = total / (N + 1);
// Traversing to find the elements of nums[]
for (int i = 0; i < N; i++) {
arr.set(i, arr.get(i) - sum);
}
}
// Driver Code
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
#Function to find the original array nums[]
def find_org_array(arr, N):
total = 0 #Total variable stores the sum of elements of arr[]
for val in arr:
total += val
#Sum variable stores the sum of elements of nums[]
sum = int(total / (N + 1))
#Traversing to find the elements of nums[]
for i in range(N):
arr[i] -= sum
return arr
#Driver Code
arr=[9, 10, 11, 10]
n=4
#function call
arr=find_org_array(arr,n)
for val in arr:
print(val,end=" ")
C#
using System;
using System.Collections.Generic;
class Program
{
// Function to find the original array nums[]
static void FindOrgArray(List<int> arr, int N)
{
// Total variable stores the sum of elements of arr[]
int total = 0;
foreach (int val in arr)
total += val;
// Sum variable stores the sum of elements of nums[]
int sum = total / (N + 1);
// Traversing to find the elements of nums[]
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 to find the original array nums[]
function findOrgArray(arr, N) {
// Total variable stores the sum of elements of arr[]
let total = 0;
for (let val of arr) {
total += val;
}
// Sum variable stores the sum of elements of nums[]
let sum = Math.floor(total / (N + 1));
// Traversing to find the elements of nums[]
for (let i = 0; i < N; i++) {
arr[i] = arr[i] - sum;
}
}
// Driver code
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
5 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
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
Rearrange array elements to maximize the sum of MEX of all prefix arrays
Given an array arr[] of size N, the task is to rearrange the array elements such that the sum of MEX of all prefix arrays is the maximum possible. Note: MEX of a sequence is the minimum non-negative number not present in the sequence. Examples: Input: arr[] = {2, 0, 1}Output: 0, 1, 2Explanation:Sum
7 min read