Maximize value of (arr[i] – i) – (arr[j] – j) in an array
Given an array, arr[] find the maximum value of (arr[i] – i) – (arr[j] – j) where i is not equal to j. Where i and j vary from 0 to n-1 and n is size of input array arr[].
Examples:
Input : arr[] = {9, 15, 4, 12, 13}
Output : 12
We get the maximum value for i = 1 and j = 2
(15 - 1) - (4 - 2) = 12
Input : arr[] = {-1, -2, -3, 4, 10}
Output : 6
We get the maximum value for i = 4 and j = 2
(10 - 4) - (-3 - 2) = 11
One important observation is, value of (arr[i] – i) – (arr[j] – j) can never be negative. We can always swap i and j to convert a negative value into a positive. So the condition i not equal to j is bogus and doesn’t require an explicit check.
Method 1 (Naive : O(n2)): The idea is to run two loops to consider all possible pairs and keep track of maximum value of expression (arr[i]-i)-(arr[j]-j). Below is the implementation of this idea.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
int findMaxDiff( int arr[], int n)
{
if (n < 2)
{
cout << "Invalid " ;
return 0;
}
int res = INT_MIN;
for ( int i=0; i<n; i++)
for ( int j=0; j<n; j++)
if ( res < (arr[i]-arr[j]-i+j) )
res = (arr[i]-arr[j]-i+j);
return res;
}
int main()
{
int arr[] = {9, 15, 4, 12, 13};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << findMaxDiff(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int findMaxDiff( int arr[], int n)
{
if (n < 2 ) {
System.out.print( "Invalid " );
return 0 ;
}
int res = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
for ( int j = 0 ; j < n; j++)
if (res < (arr[i] - arr[j] - i + j))
res = (arr[i] - arr[j] - i + j);
return res;
}
public static void main(String[] args)
{
int arr[] = { 9 , 15 , 4 , 12 , 13 };
int n = arr.length;
System.out.print(findMaxDiff(arr, n));
}
}
|
Python3
def findMaxDiff(arr,n):
if (n < 2 ):
print ( "Invalid " )
return 0
res = - 2147483648
for i in range (n):
for j in range (n):
if ( res < (arr[i] - arr[j] - i + j) ):
res = (arr[i] - arr[j] - i + j)
return res
arr = [ 9 , 15 , 4 , 12 , 13 ]
n = len (arr)
print (findMaxDiff(arr, n))
|
C#
using System;
class GFG {
static int findMaxDiff( int []arr, int n)
{
if (n < 2) {
Console.WriteLine( "Invalid " );
return 0;
}
int res = int .MinValue;
for ( int i = 0; i < n; i++)
for ( int j = 0; j < n; j++)
if (res < (arr[i] - arr[j] - i + j))
res = (arr[i] - arr[j] - i + j);
return res;
}
public static void Main()
{
int []arr = {9, 15, 4, 12, 13};
int n = arr.Length;
Console.WriteLine(findMaxDiff(arr, n));
}
}
|
PHP
<?php
function findMaxDiff( $arr , $n )
{
if ( $n < 2)
{
echo "Invalid " ;
return 0;
}
$res = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
for ( $j = 0; $j < $n ; $j ++)
if ( $res < ( $arr [ $i ] - $arr [ $j ] - $i + $j ))
$res = ( $arr [ $i ] - $arr [ $j ] - $i + $j );
return $res ;
}
$arr = array (9, 15, 4, 12, 13);
$n = count ( $arr );
echo findMaxDiff( $arr , $n );
?>
|
Javascript
<script>
function findMaxDiff(arr, n)
{
if (n < 2) {
document.write( "Invalid " );
return 0;
}
let res = Number.MIN_VALUE;
for (let i = 0; i < n; i++)
for (let j = 0; j < n; j++)
if (res < (arr[i] - arr[j] - i + j))
res = (arr[i] - arr[j] - i + j);
return res;
}
let arr = [9, 15, 4, 12, 13];
let n = arr.length;
document.write(findMaxDiff(arr, n));
</script>
|
Auxiliary Space: O(1), since no extra space used.
Method 2 (Tricky : O(n)):
- Find maximum value of arr[i] – i in whole array.
- Find minimum value of arr[i] – i in whole array.
- Return difference of above two values.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
int findMaxDiff( int a[], int n)
{
if (n < 2)
{
cout << "Invalid " ;
return 0;
}
int min_val = INT_MAX, max_val =
INT_MIN;
for ( int i=0; i<n; i++)
{
if ((a[i]-i) > max_val)
max_val = a[i] - i;
if ((a[i]-i) < min_val)
min_val = a[i]-i;
}
return (max_val - min_val);
}
int main()
{
int arr[] = {9, 15, 4, 12, 13};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << findMaxDiff(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int findMaxDiff( int arr[], int n)
{
if (n < 2 )
{
System.out.println( "Invalid " );
return 0 ;
}
int min_val = Integer.MAX_VALUE,
max_val = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
{
if ((arr[i]-i) > max_val)
max_val = arr[i] - i;
if ((arr[i]-i) < min_val)
min_val = arr[i]-i;
}
return (max_val - min_val);
}
public static void main(String[] args)
{
int arr[] = { 9 , 15 , 4 , 12 , 13 };
int n = arr.length;
System.out.println(findMaxDiff(arr, n));
}
}
|
Python3
import sys
def findMaxDiff(a, n):
if (n < 2 ):
print ( "Invalid " )
return 0
min_val = sys.maxsize
max_val = - sys.maxsize - 1
for i in range (n):
if ((a[i] - i) > max_val):
max_val = a[i] - i
if ((a[i] - i) < min_val):
min_val = a[i] - i
return (max_val - min_val)
if __name__ = = '__main__' :
arr = [ 9 , 15 , 4 , 12 , 13 ]
n = len (arr)
print (findMaxDiff(arr, n))
|
C#
using System;
class GFG {
static int findMaxDiff( int []arr, int n)
{
if (n < 2)
{
Console.Write( "Invalid " );
return 0;
}
int min_val = int .MaxValue,
max_val = int .MinValue;
for ( int i = 0; i < n; i++)
{
if ((arr[i] - i) > max_val)
max_val = arr[i] - i;
if ((arr[i] - i) < min_val)
min_val = arr[i] - i;
}
return (max_val - min_val);
}
public static void Main()
{
int []arr = {9, 15, 4, 12, 13};
int n = arr.Length;
Console.Write(findMaxDiff(arr, n));
}
}
|
PHP
<?php
function findMaxDiff( $a , $n )
{
if ( $n < 2)
{
echo "Invalid " ;
return 0;
}
$min_val = PHP_INT_MAX;
$max_val = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
{
if (( $a [ $i ] - $i ) > $max_val )
$max_val = $a [ $i ] - $i ;
if (( $a [ $i ] - $i ) < $min_val )
$min_val = $a [ $i ] - $i ;
}
return ( $max_val - $min_val );
}
$arr = array (9, 15, 4, 12, 13);
$n = sizeof( $arr );
echo findMaxDiff( $arr , $n );
?>
|
Javascript
<script>
function findMaxDiff(arr, n)
{
if (n < 2)
{
document.write( "Invalid " );
return 0;
}
let min_val =
Number.MAX_VALUE, max_val = Number.MIN_VALUE;
for (let i = 0; i < n; i++)
{
if ((arr[i] - i) > max_val)
max_val = arr[i] - i;
if ((arr[i] - i) < min_val)
min_val = arr[i] - i;
}
return (max_val - min_val);
}
let arr = [9, 15, 4, 12, 13];
let n = arr.length;
document.write(findMaxDiff(arr, n));
</script>
|
Auxiliary Space: O(1), since no extra space used.
Last Updated :
20 Mar, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...