Maximize distance between smallest and largest Array elements by a single swap
Last Updated :
15 Dec, 2022
Given an arr[] consisting of N elements in the range [1, N], the task is to maximize the distance between smallest and largest array element by a single swap.
Examples:
Input: arr[] = {1, 4, 3, 2}
Output: 3
Explanation:
Swapping of arr[1] and arr[3] maximizes the distance.
Input: arr[] = {1, 6, 5, 3, 4, 7, 2}
Output: 6
Explanation:
Swapping of arr[5] and arr[6] maximizes the distance.
Approach
- Find the indices of 1 and N in the array.
- Let minIdx and maxIdx be the minimum and maximum of the two indices, respectively.
- Now, maxIdx – minIdx is the current distance between the two elements. It can be maximized by the maximum possible from the following two swaps:
- Swapping a[minIdx] with a[0] increasing the distance by minIdx.
- Swapping a[maxIdx] with a[N – 1] increasing the distance by N – 1 – maxIdx.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int find_max_dist( int arr[], int N)
{
int minIdx = -1, maxIdx = -1;
for ( int i = 0; i < N; i++) {
if (arr[i] == 1 || arr[i] == N) {
if (minIdx == -1)
minIdx = i;
else {
maxIdx = i;
break ;
}
}
}
return maxIdx - minIdx
+ max(minIdx, N - 1 - maxIdx);
}
int main()
{
int arr[] = { 1, 4, 3, 2 };
int N = sizeof (arr) / sizeof (arr[0]);
cout << find_max_dist(arr, N) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG{
static int find_max_dist( int arr[], int N)
{
int minIdx = - 1 , maxIdx = - 1 ;
for ( int i = 0 ; i < N; i++)
{
if (arr[i] == 1 || arr[i] == N)
{
if (minIdx == - 1 )
minIdx = i;
else
{
maxIdx = i;
break ;
}
}
}
return maxIdx - minIdx +
Math.max(minIdx, N - 1 - maxIdx);
}
public static void main(String[] args)
{
int arr[] = { 1 , 4 , 3 , 2 };
int N = arr.length;
System.out.print(find_max_dist(arr, N) + "\n" );
}
}
|
Python3
def find_max_dist(arr, N):
minIdx, maxIdx = - 1 , - 1
for i in range (N):
if (arr[i] = = 1 or arr[i] = = N):
if (minIdx = = - 1 ) :
minIdx = i
else :
maxIdx = i
break
return (maxIdx - minIdx +
max (minIdx, N - 1 - maxIdx))
arr = [ 1 , 4 , 3 , 2 ]
N = len (arr)
print (find_max_dist(arr, N))
|
C#
using System;
class GFG{
static int find_max_dist( int []arr, int N)
{
int minIdx = -1, maxIdx = -1;
for ( int i = 0; i < N; i++)
{
if (arr[i] == 1 || arr[i] == N)
{
if (minIdx == -1)
minIdx = i;
else
{
maxIdx = i;
break ;
}
}
}
return maxIdx - minIdx +
Math.Max(minIdx, N - 1 - maxIdx);
}
public static void Main(String[] args)
{
int []arr = { 1, 4, 3, 2 };
int N = arr.Length;
Console.Write(find_max_dist(arr, N) + "\n" );
}
}
|
Javascript
<script>
function find_max_dist(arr , N)
{
var minIdx = -1, maxIdx = -1;
for (i = 0; i < N; i++)
{
if (arr[i] == 1 || arr[i] == N)
{
if (minIdx == -1)
minIdx = i;
else
{
maxIdx = i;
break ;
}
}
}
return maxIdx - minIdx +
Math.max(minIdx, N - 1 - maxIdx);
}
var arr = [ 1, 4, 3, 2 ];
var N = arr.length;
document.write(find_max_dist(arr, N) + "\n" );
</script>
|
Time Complexity: O(N)
Auxiliary space: O(1) as it is using constant space for variable
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...