Replace elements with absolute difference of smallest element on left and largest element on right
Last Updated :
12 Oct, 2022
Given an array arr[] of N integers. The task is to replace all the elements of the array by the absolute difference of the smallest element on its left and the largest element on its right.
Examples:
Input: arr[] = {1, 5, 2, 4, 3}
Output: 5 3 3 2 1
Element |
Smallest on its left |
Largest on its right |
Absolute difference |
1 |
NULL |
5 |
5 |
5 |
1 |
4 |
3 |
2 |
1 |
4 |
3 |
4 |
1 |
3 |
2 |
3 |
1 |
NULL |
1 |
Input: arr[] = {4, 3, 6, 2, 1, 20, 9, 10, 15, 6}
Output: 20 16 17 17 18 14 14 14 5 1
Naive approach: For every element arr[i] of the array, find the minimum element in the subarray arr[0…i-1] then the maximum element in the subarray arr[i+1…n-1] and print the absolute difference between the two. The time complexity of this approach will be O(N2).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printArray( int arr[], int n)
{
for ( int i = 0; i < n; i++) {
cout << arr[i] << " " ;
}
}
int getMin( int arr[], int i, int j)
{
int minVal = arr[i++];
while (i <= j) {
minVal = min(minVal, arr[i]);
i++;
}
return minVal;
}
int getMax( int arr[], int i, int j)
{
int maxVal = arr[i++];
while (i <= j) {
maxVal = max(maxVal, arr[i]);
i++;
}
return maxVal;
}
void generateArr( int arr[], int n)
{
if (n == 0)
return ;
if (n == 1) {
cout << arr[0];
return ;
}
int tmpArr[n];
tmpArr[0] = getMax(arr, 1, n - 1);
for ( int i = 1; i < n - 1; i++) {
tmpArr[i] = abs (getMax(arr, i + 1, n - 1)
- getMin(arr, 0, i - 1));
}
tmpArr[n - 1] = getMin(arr, 0, n - 2);
printArray(tmpArr, n);
}
int main()
{
int arr[] = { 1, 5, 2, 4, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
generateArr(arr, n);
return 0;
}
|
Java
class GFG
{
static void printArray( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
{
System.out.print(arr[i] + " " );
}
}
static int getMin( int arr[], int i, int j)
{
int minVal = arr[i++];
while (i <= j)
{
minVal = Math.min(minVal, arr[i]);
i++;
}
return minVal;
}
static int getMax( int arr[], int i, int j)
{
int maxVal = arr[i++];
while (i <= j)
{
maxVal = Math.max(maxVal, arr[i]);
i++;
}
return maxVal;
}
static void generateArr( int arr[], int n)
{
if (n == 0 )
return ;
if (n == 1 )
{
System.out.println(arr[ 0 ]);
return ;
}
int tmpArr[] = new int [n];
tmpArr[ 0 ] = getMax(arr, 1 , n - 1 );
for ( int i = 1 ; i < n - 1 ; i++)
{
tmpArr[i] = Math.abs(getMax(arr, i + 1 , n - 1 ) -
getMin(arr, 0 , i - 1 ));
}
tmpArr[n - 1 ] = getMin(arr, 0 , n - 2 );
printArray(tmpArr, n);
}
public static void main (String[] args)
{
int arr[] = { 1 , 5 , 2 , 4 , 3 };
int n = arr.length;
generateArr(arr, n);
}
}
|
Python3
def printArray(arr, n):
for i in range (n):
print (arr[i], end = " " )
def getMin(arr, i, j):
minVal = arr[i]
i + = 1
while (i < = j):
minVal = min (minVal, arr[i])
i + = 1
return minVal
def getMax(arr, i, j):
maxVal = arr[i]
i + = 1
while (i < = j):
maxVal = max (maxVal, arr[i])
i + = 1
return maxVal
def generateArr(arr, n):
if (n = = 0 ):
return
if (n = = 1 ):
print (arr[ 0 ], end = "")
return
tmpArr = [ 0 for i in range (n)]
tmpArr[ 0 ] = getMax(arr, 1 , n - 1 )
for i in range ( 1 , n - 1 ):
tmpArr[i] = abs (getMax(arr, i + 1 , n - 1 ) -
getMin(arr, 0 , i - 1 ))
tmpArr[n - 1 ] = getMin(arr, 0 , n - 2 )
printArray(tmpArr, n)
arr = [ 1 , 5 , 2 , 4 , 3 ]
n = len (arr)
generateArr(arr, n)
|
C#
using System;
class GFG
{
static void printArray( int []arr, int n)
{
for ( int i = 0; i < n; i++)
{
Console.Write(arr[i] + " " );
}
}
static int getMin( int []arr, int i, int j)
{
int minVal = arr[i++];
while (i <= j)
{
minVal = Math.Min(minVal, arr[i]);
i++;
}
return minVal;
}
static int getMax( int []arr, int i, int j)
{
int maxVal = arr[i++];
while (i <= j)
{
maxVal = Math.Max(maxVal, arr[i]);
i++;
}
return maxVal;
}
static void generateArr( int []arr, int n)
{
if (n == 0)
return ;
if (n == 1)
{
Console.WriteLine(arr[0]);
return ;
}
int []tmpArr = new int [n];
tmpArr[0] = getMax(arr, 1, n - 1);
for ( int i = 1; i < n - 1; i++)
{
tmpArr[i] = Math.Abs(getMax(arr, i + 1, n - 1) -
getMin(arr, 0, i - 1));
}
tmpArr[n - 1] = getMin(arr, 0, n - 2);
printArray(tmpArr, n);
}
static public void Main ()
{
int []arr = { 1, 5, 2, 4, 3 };
int n = arr.Length;
generateArr(arr, n);
}
}
|
Javascript
<script>
function printArray(arr, n)
{
for (let i = 0; i < n; i++)
{
document.write(arr[i] + " " );
}
}
function getMin(arr, i, j)
{
let minVal = arr[i++];
while (i <= j)
{
minVal = Math.min(minVal, arr[i]);
i++;
}
return minVal;
}
function getMax(arr, i, j)
{
let maxVal = arr[i++];
while (i <= j)
{
maxVal = Math.max(maxVal, arr[i]);
i++;
}
return maxVal;
}
function generateArr(arr, n)
{
if (n == 0)
return ;
if (n == 1)
{
document.write(arr[0] + "</br>" );
return ;
}
let tmpArr = new Array(n);
tmpArr.fill(0);
tmpArr[0] = getMax(arr, 1, n - 1);
for (let i = 1; i < n - 1; i++)
{
tmpArr[i] = Math.abs(getMax(arr, i + 1, n - 1) -
getMin(arr, 0, i - 1));
}
tmpArr[n - 1] = getMin(arr, 0, n - 2);
printArray(tmpArr, n);
}
let arr = [ 1, 5, 2, 4, 3 ];
let n = arr.length;
generateArr(arr, n);
</script>
|
Time complexity: O(N2) where N is the size of the given array
Auxiliary space: O(N)
Efficient approach: Create an array suffixMax[] where suffixMax[i] will store the maximum element in the subarray arr[i…N-1]. Also take a variable minSoFar which will store the minimum element so far on traversing the array from left to right. Now, for every element arr[i] the updated value will be abs(suffixMax[i + 1] – minSoFar).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printArray( int arr[], int n)
{
for ( int i = 0; i < n; i++) {
cout << arr[i] << " " ;
}
}
void generateArr( int arr[], int n)
{
if (n == 0)
return ;
if (n == 1) {
cout << arr[0];
return ;
}
int suffixMax[n];
suffixMax[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixMax[i] = max(arr[i], suffixMax[i + 1]);
int minSoFar = arr[0];
arr[0] = suffixMax[1];
for ( int i = 1; i < n - 1; i++) {
int temp = arr[i];
arr[i] = abs (suffixMax[i + 1] - minSoFar);
minSoFar = min(minSoFar, temp);
}
arr[n - 1] = minSoFar;
printArray(arr, n);
}
int main()
{
int arr[] = { 1, 5, 2, 4, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
generateArr(arr, n);
return 0;
}
|
Java
class GFG
{
static void printArray( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
{
System.out.print(arr[i] + " " );
}
}
static void generateArr( int arr[], int n)
{
if (n == 0 )
return ;
if (n == 1 )
{
System.out.print(arr[ 0 ]);
return ;
}
int []suffixMax = new int [n];
suffixMax[n - 1 ] = arr[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
suffixMax[i] = Math.max(arr[i],
suffixMax[i + 1 ]);
int minSoFar = arr[ 0 ];
arr[ 0 ] = suffixMax[ 1 ];
for ( int i = 1 ; i < n - 1 ; i++)
{
int temp = arr[i];
arr[i] = Math.abs(suffixMax[i + 1 ] -
minSoFar);
minSoFar = Math.min(minSoFar, temp);
}
arr[n - 1 ] = minSoFar;
printArray(arr, n);
}
public static void main (String[] args)
{
int arr[] = { 1 , 5 , 2 , 4 , 3 };
int n = arr.length;
generateArr(arr, n);
}
}
|
Python3
def printArray(arr, n):
for i in range ( n):
print (arr[i],end = " " )
def generateArr(arr, n):
if (n = = 0 ):
return
if (n = = 1 ):
print ( arr[ 0 ])
return
suffixMax = [ 0 ] * n
suffixMax[n - 1 ] = arr[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
suffixMax[i] = max (arr[i], suffixMax[i + 1 ])
minSoFar = arr[ 0 ]
arr[ 0 ] = suffixMax[ 1 ]
for i in range ( 1 ,n - 1 ):
temp = arr[i]
arr[i] = abs (suffixMax[i + 1 ] - minSoFar)
minSoFar = min (minSoFar, temp)
arr[n - 1 ] = minSoFar
printArray(arr, n)
if __name__ = = "__main__" :
arr = [ 1 , 5 , 2 , 4 , 3 ]
n = len (arr)
generateArr(arr, n)
|
C#
using System;
class GFG
{
static void printArray( int []arr, int n)
{
for ( int i = 0; i < n; i++)
{
Console.Write(arr[i] + " " );
}
}
static void generateArr( int []arr, int n)
{
if (n == 0)
return ;
if (n == 1)
{
Console.Write(arr[0]);
return ;
}
int []suffixMax = new int [n];
suffixMax[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffixMax[i] = Math.Max(arr[i],
suffixMax[i + 1]);
int minSoFar = arr[0];
arr[0] = suffixMax[1];
for ( int i = 1; i < n - 1; i++)
{
int temp = arr[i];
arr[i] = Math.Abs(suffixMax[i + 1] -
minSoFar);
minSoFar = Math.Min(minSoFar, temp);
}
arr[n - 1] = minSoFar;
printArray(arr, n);
}
public static void Main (String[] args)
{
int []arr = { 1, 5, 2, 4, 3 };
int n = arr.Length;
generateArr(arr, n);
}
}
|
Javascript
<script>
function printArray(arr, n)
{
for (let i = 0; i < n; i++)
{
document.write(arr[i] + " " );
}
}
function generateArr(arr, n)
{
if (n == 0)
return ;
if (n == 1)
{
document.write(arr[0]);
return ;
}
let suffixMax = new Array(n);
suffixMax.fill(0);
suffixMax[n - 1] = arr[n - 1];
for (let i = n - 2; i >= 0; i--)
suffixMax[i] = Math.max(arr[i], suffixMax[i + 1]);
let minSoFar = arr[0];
arr[0] = suffixMax[1];
for (let i = 1; i < n - 1; i++)
{
let temp = arr[i];
arr[i] = Math.abs(suffixMax[i + 1] -
minSoFar);
minSoFar = Math.min(minSoFar, temp);
}
arr[n - 1] = minSoFar;
printArray(arr, n);
}
let arr = [ 1, 5, 2, 4, 3 ];
let n = arr.length;
generateArr(arr, n);
</script>
|
Time complexity: O(N) where N is size of given array
Auxiliary space: O(N)
Share your thoughts in the comments
Please Login to comment...