Replace all elements by difference of sums of positive and negative numbers after that element
Last Updated :
18 Nov, 2022
Given an array of positive and negative elements. The task is to replace every i-th element of the array by the absolute difference of absolute sums of positive and negative elements in the range i+1 to N. That is, find the absolute sum of all positive elements and the absolute sum of all negative elements in the range i+1 to N. Now find the absolute difference between these two sums and replace it with the i-th element.
Note: The last element of the updated array will be zero.
Examples:
Input : N = 5, arr[] = {1, -1, 2, 3, -2}
Output : arr[] = {2, 3, 1, 2, 0}
Input : N = 6, arr[] = {-3, -4, -2, 5, 1, -2}
Output : arr[] = {2, 2, 4, 1, 2, 0}.
Naive Approach: The naive approach is to run two for loops and for all i-th elements, calculate abs value of the sum of all positive and negative elements with an index in the range i+1 to N. Now find the absolute difference of both sums and replace it with the i-th element.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
void printArray( int N, int arr[])
{
for ( int i = 0; i < N; i++)
cout << arr[i] << " " ;
cout << endl;
}
void replacedArray( int N, int arr[])
{
int pos_sum, neg_sum, i, j, diff;
for (i = 0; i < N; i++) {
pos_sum = 0;
neg_sum = 0;
for (j = i + 1; j < N; j++) {
if (arr[j] > 0)
pos_sum += arr[j];
else
neg_sum += arr[j];
}
diff = abs (pos_sum) - abs (neg_sum);
arr[i] = abs (diff);
}
}
int main()
{
int N = 5;
int arr[] = { 1, -1, 2, 3, -2 };
replacedArray(N, arr);
printArray(N, arr);
N = 6;
int arr1[] = { -3, -4, -2, 5, 1, -2 };
replacedArray(N, arr1);
printArray(N, arr1);
return 0;
}
|
Java
class GFG
{
static void printArray( int N, int []arr)
{
for ( int i = 0 ; i < N; i++)
System.out.print(arr[i] + " " );
System.out.println();
}
static void replacedArray( int N, int []arr)
{
int pos_sum, neg_sum, i, j, diff;
for (i = 0 ; i < N; i++)
{
pos_sum = 0 ;
neg_sum = 0 ;
for (j = i + 1 ; j < N; j++)
{
if (arr[j] > 0 )
pos_sum += arr[j];
else
neg_sum += arr[j];
}
diff = Math.abs(pos_sum) - Math.abs(neg_sum);
arr[i] = Math.abs(diff);
}
}
public static void main(String args[])
{
int N = 5 ;
int []arr = { 1 , - 1 , 2 , 3 , - 2 };
replacedArray(N, arr);
printArray(N, arr);
N = 6 ;
int []arr1 = { - 3 , - 4 , - 2 , 5 , 1 , - 2 };
replacedArray(N, arr1);
printArray(N, arr1);
}
}
|
Python3
def printArray(N, arr):
for i in range (N):
print (arr[i], end = " " )
print ( "\n" , end = "")
def replacedArray(N, arr):
for i in range (N):
pos_sum = 0
neg_sum = 0
for j in range (i + 1 , N, 1 ):
if (arr[j] > 0 ):
pos_sum + = arr[j]
else :
neg_sum + = arr[j]
diff = abs (pos_sum) - abs (neg_sum)
arr[i] = abs (diff)
if __name__ = = '__main__' :
N = 5
arr = [ 1 , - 1 , 2 , 3 , - 2 ]
replacedArray(N, arr)
printArray(N, arr)
N = 6
arr1 = [ - 3 , - 4 , - 2 , 5 , 1 , - 2 ]
replacedArray(N, arr1)
printArray(N, arr1)
|
C#
using System;
class GFG
{
static void printArray( int N, int []arr)
{
for ( int i = 0; i < N; i++)
Console.Write(arr[i] + " " );
Console.WriteLine();
}
static void replacedArray( int N, int []arr)
{
int pos_sum, neg_sum, i, j, diff;
for (i = 0; i < N; i++)
{
pos_sum = 0;
neg_sum = 0;
for (j = i + 1; j < N; j++)
{
if (arr[j] > 0)
pos_sum += arr[j];
else
neg_sum += arr[j];
}
diff = Math.Abs(pos_sum) - Math.Abs(neg_sum);
arr[i] = Math.Abs(diff);
}
}
static void Main()
{
int N = 5;
int []arr = { 1, -1, 2, 3, -2 };
replacedArray(N, arr);
printArray(N, arr);
N = 6;
int []arr1 = { -3, -4, -2, 5, 1, -2 };
replacedArray(N, arr1);
printArray(N, arr1);
}
}
|
Javascript
<script>
function printArray(N, arr)
{
for (i = 0; i < N; i++)
document.write(arr[i] + " " );
document.write( "<br/>" );
}
function replacedArray(N, arr)
{
var pos_sum, neg_sum, i, j, diff;
for (i = 0; i < N; i++)
{
pos_sum = 0;
neg_sum = 0;
for (j = i + 1; j < N; j++)
{
if (arr[j] > 0)
pos_sum += arr[j];
else
neg_sum += arr[j];
}
diff = Math.abs(pos_sum) -
Math.abs(neg_sum);
arr[i] = Math.abs(diff);
}
}
var N = 5;
var arr = [ 1, -1, 2, 3, -2 ];
replacedArray(N, arr);
printArray(N, arr);
N = 6;
var arr1 = [ -3, -4, -2, 5, 1, -2 ];
replacedArray(N, arr1);
printArray(N, arr1);
</script>
|
Output:
2 3 1 2 0
2 2 4 1 2 0
Time Complexity: O(n2), where n is the size of the given array.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Efficient Approach: Initialize positive and negative sums as 0. Now run a single for loop from the last element to the first element and calculate diff = abs(pos_sum) – abs(neg_sum).
Now if the i-th element is positive, add it to pos_sum otherwise add it to neg_sum. After all, replace the i-th element with absolute difference i.e. abs(diff).
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
void printArray( int N, int arr[])
{
for ( int i = 0; i < N; i++)
cout << arr[i] << " " ;
cout << endl;
}
void replacedArray( int N, int arr[])
{
int pos_sum, neg_sum, i, j, diff;
pos_sum = 0;
neg_sum = 0;
for (i = N - 1; i >= 0; i--) {
diff = abs (pos_sum) - abs (neg_sum);
if (arr[i] > 0)
pos_sum += arr[i];
else
neg_sum += arr[i];
arr[i] = abs (diff);
}
}
int main()
{
int N = 5;
int arr[] = { 1, -1, 2, 3, -2 };
replacedArray(N, arr);
printArray(N, arr);
N = 6;
int arr1[] = { -3, -4, -2, 5, 1, -2 };
replacedArray(N, arr1);
printArray(N, arr1);
return 0;
}
|
Java
class GFG
{
static void printArray( int N, int arr[])
{
for ( int i = 0 ; i < N; i++)
System.out.print(arr[i] + " " );
System.out.println();
}
static void replacedArray( int N, int arr[])
{
int pos_sum, neg_sum, i, j, diff;
pos_sum = 0 ;
neg_sum = 0 ;
for (i = N - 1 ; i >= 0 ; i--)
{
diff = Math.abs(pos_sum) - Math.abs(neg_sum);
if (arr[i] > 0 )
pos_sum += arr[i];
else
neg_sum += arr[i];
arr[i] = Math.abs(diff);
}
}
public static void main (String[] args)
{
int N = 5 ;
int arr[] = { 1 , - 1 , 2 , 3 , - 2 };
replacedArray(N, arr);
printArray(N, arr);
N = 6 ;
int arr1[] = { - 3 , - 4 , - 2 , 5 , 1 , - 2 };
replacedArray(N, arr1);
printArray(N, arr1);
}
}
|
Python3
def printArray(N, arr) :
for i in range ( 0 , N) :
print (arr[i], end = " " )
print ()
def replacedArray(N, arr) :
pos_sum = 0
neg_sum = 0
for i in range (N - 1 , - 1 , - 1 ) :
diff = abs (pos_sum) - abs (neg_sum)
if (arr[i] > 0 ) :
pos_sum = pos_sum + arr[i]
else :
neg_sum = neg_sum + arr[i]
arr[i] = abs (diff)
N = 5
arr = [ 1 , - 1 , 2 , 3 , - 2 ]
replacedArray(N, arr)
printArray(N, arr)
N = 6
arr1 = [ - 3 , - 4 , - 2 , 5 , 1 , - 2 ]
replacedArray(N, arr1)
printArray(N, arr1)
|
C#
using System;
class GFG
{
static void printArray( int N, int [] arr)
{
for ( int i = 0; i < N; i++)
Console.Write(arr[i] + " " );
Console.WriteLine();
}
static void replacedArray( int N, int [] arr)
{
int pos_sum, neg_sum, i, diff;
pos_sum = 0;
neg_sum = 0;
for (i = N - 1; i >= 0; i--)
{
diff = Math.Abs(pos_sum) - Math.Abs(neg_sum);
if (arr[i] > 0)
pos_sum += arr[i];
else
neg_sum += arr[i];
arr[i] = Math.Abs(diff);
}
}
public static void Main ()
{
int N = 5;
int [] arr = { 1, -1, 2, 3, -2 };
replacedArray(N, arr);
printArray(N, arr);
N = 6;
int [] arr1 = { -3, -4, -2, 5, 1, -2 };
replacedArray(N, arr1);
printArray(N, arr1);
}
}
|
Javascript
<script>
function printArray(N, arr)
{
for ( var i = 0; i < N; i++)
document.write( arr[i] + " " );
document.write( "<br>" );
}
function replacedArray( N, arr)
{
var pos_sum, neg_sum, i, j, diff;
pos_sum = 0;
neg_sum = 0;
for (i = N - 1; i >= 0; i--) {
diff = Math.abs(pos_sum) - Math.abs(neg_sum);
if (arr[i] > 0)
pos_sum += arr[i];
else
neg_sum += arr[i];
arr[i] = Math.abs(diff);
}
}
var N = 5;
var arr = [ 1, -1, 2, 3, -2 ];
replacedArray(N, arr);
printArray(N, arr);
N=6;
var arr1 = [-3, -4, -2, 5, 1, -2 ];
replacedArray(N, arr1);
printArray(N, arr1);
</script>
|
Output:
2 3 1 2 0
2 2 4 1 2 0
Time complexity: O(N), where N is the number of elements.
Auxiliary Space: O(1) as it is using constant space for variables
Share your thoughts in the comments
Please Login to comment...