Minimize sum of adjacent difference with removal of one element from array
Last Updated :
18 Oct, 2022
Given an array of positive integers of size greater than 2. The task is to find the minimum value of the sum of consecutive difference modulus of an array, i.e. the value of |A1-A0|+|A2-A1|+|A3-A2|+……+|An-1-An-2|+|An-A(n-1)| after removal of one element from the array, where An represents the nth index of an array element value.
Examples:
Input: arr[] = [1, 5, 3, 2, 10]
Output: 7
On removing 10, we get B = {1, 5, 3, 2} i.e. |1-5|+|5-3|+|3-2| = 4+2+1 = 7
Input: arr[] = [6, 12, 7, 8, 10, 15]
Output: 9
On removing 12, we get B = {6, 12, 7, 8, 10, 15} i.e. |6-7|+|7-8|+|8-10|+|10-15| = 1+1+2+5 = 9
The idea is to traverse the array from start to end, find the element in the array on which we get a maximum difference of consecutive modulus after its removal. Subtract the maximum value obtained from the total value calculated.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findMinRemoval( int arr[], int n)
{
int temp, value = 0;
int maximum = 0;
if (n == 1)
return 0;
for ( int i = 0; i < n; i++) {
if (i != 0 && i != n - 1) {
value = value + abs (arr[i] - arr[i + 1]);
temp = abs (arr[i] - arr[i + 1]) +
abs (arr[i] - arr[i - 1]) -
abs (arr[i - 1] - arr[i + 1]);
}
else if (i == 0) {
value = value + abs (arr[i] - arr[i + 1]);
temp = abs (arr[i] - arr[i + 1]);
}
else
temp = abs (arr[i] - arr[i - 1]);
maximum = max(maximum, temp);
}
return (value - maximum);
}
int main()
{
int arr[] = { 1, 5, 3, 2, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << findMinRemoval(arr, n) << "\n" ;
return 0;
}
|
Java
class GFG
{
static int findMinRemoval( int arr[], int n)
{
int temp, value = 0 ;
int maximum = 0 ;
if (n == 1 )
return 0 ;
for ( int i = 0 ; i < n; i++)
{
if (i != 0 && i != n - 1 )
{
value = value + Math.abs(arr[i] - arr[i + 1 ]);
temp = Math.abs(arr[i] - arr[i + 1 ]) +
Math.abs(arr[i] - arr[i - 1 ]) -
Math.abs(arr[i - 1 ] - arr[i + 1 ]);
}
else if (i == 0 )
{
value = value + Math.abs(arr[i] - arr[i + 1 ]);
temp = Math.abs(arr[i] - arr[i + 1 ]);
}
else
temp = Math.abs(arr[i] - arr[i - 1 ]);
maximum = Math.max(maximum, temp);
}
return (value - maximum);
}
public static void main(String[] args)
{
int arr[] = { 1 , 5 , 3 , 2 , 10 };
int n = arr.length;
System.out.print(findMinRemoval(arr, n) + "\n" );
}
}
|
Python 3
def findMinRemoval(arr, n):
value = 0
maximum = 0
if (n = = 1 ):
return 0
for i in range ( n):
if (i ! = 0 and i ! = n - 1 ):
value = value + abs (arr[i] - arr[i + 1 ])
temp = ( abs (arr[i] - arr[i + 1 ]) +
abs (arr[i] - arr[i - 1 ]) -
abs (arr[i - 1 ] - arr[i + 1 ]))
elif (i = = 0 ):
value = value + abs (arr[i] - arr[i + 1 ])
temp = abs (arr[i] - arr[i + 1 ])
else :
temp = abs (arr[i] - arr[i - 1 ])
maximum = max (maximum, temp)
return (value - maximum)
if __name__ = = "__main__" :
arr = [ 1 , 5 , 3 , 2 , 10 ]
n = len (arr)
print (findMinRemoval(arr, n))
|
C#
using System;
class GFG
{
static int findMinRemoval( int []arr, int n)
{
int temp, value = 0;
int maximum = 0;
if (n == 1)
return 0;
for ( int i = 0; i < n; i++)
{
if (i != 0 && i != n - 1)
{
value = value + Math.Abs(arr[i] - arr[i + 1]);
temp = Math.Abs(arr[i] - arr[i + 1]) +
Math.Abs(arr[i] - arr[i - 1]) -
Math.Abs(arr[i - 1] - arr[i + 1]);
}
else if (i == 0)
{
value = value + Math.Abs(arr[i] - arr[i + 1]);
temp = Math.Abs(arr[i] - arr[i + 1]);
}
else
temp = Math.Abs(arr[i] - arr[i - 1]);
maximum = Math.Max(maximum, temp);
}
return (value - maximum);
}
public static void Main()
{
int []arr = { 1, 5, 3, 2, 10 };
int n = arr.Length;
Console.WriteLine(findMinRemoval(arr, n));
}
}
|
PHP
<?php
function findMinRemoval( $arr , $n )
{
$value = 0;
$maximum = 0;
if ( $n == 1)
return 0;
$temp =0;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $i != 0 && $i != $n - 1)
{
$value = $value + abs ( $arr [ $i ] - $arr [ $i + 1]);
$temp = abs ( $arr [ $i ] - $arr [ $i + 1]) +
abs ( $arr [ $i ] - $arr [ $i - 1]) -
abs ( $arr [ $i - 1] - $arr [ $i + 1]);
}
else if ( $i == 0)
{
$value = $value + abs ( $arr [ $i ] - $arr [ $i + 1]);
$temp = abs ( $arr [ $i ] - $arr [ $i + 1]);
}
else
$temp = abs ( $arr [ $i ] - $arr [ $i - 1]);
$maximum = max( $maximum , $temp );
}
return ( $value - $maximum );
}
$arr = array ( 1, 5, 3, 2, 10 );
$n = count ( $arr );
echo findMinRemoval( $arr , $n );
?>
|
Javascript
<script>
function findMinRemoval(arr, n)
{
var temp, value = 0;
var maximum = 0;
if (n == 1)
return 0;
for ( var i = 0; i < n; i++) {
if (i != 0 && i != n - 1) {
value = value + Math.abs(arr[i] - arr[i + 1]);
temp = Math.abs(arr[i] - arr[i + 1]) +
Math.abs(arr[i] - arr[i - 1]) -
Math.abs(arr[i - 1] - arr[i + 1]);
}
else if (i == 0) {
value = value + Math.abs(arr[i] - arr[i + 1]);
temp = Math.abs(arr[i] - arr[i + 1]);
}
else
temp = Math.abs(arr[i] - arr[i - 1]);
maximum = Math.max(maximum, temp);
}
return (value - maximum);
}
var arr = [1, 5, 3, 2, 10];
var n = arr.length;
document.write( findMinRemoval(arr, n) + "<br>" );
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...