Maximize distance between smallest and largest Array elements by a single swap

• Last Updated : 22 Mar, 2021

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:
Explanation:
Swapping of arr and arr maximizes the distance.
Input: arr[] = {1, 6, 5, 3, 4, 7, 2}
Output:
Explanation:
Swappinf of arr and arr maximizes the distance.

Approach

1. Find the indices of 1 and N in the array.
2. Let minIdx and maxIdx be the minimum and maximum of the two indices, respectively.
3. 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 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++

 // C++ program maximize the// distance between smallest// and largest array element// by a single swap#include using namespace std; // Function to maximize the distance// between the smallest and largest// array element by a single swapint 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);} // Driver Codeint main(){    int arr[] = { 1, 4, 3, 2 };    int N = sizeof(arr) / sizeof(arr);    cout << find_max_dist(arr, N) << endl;    return 0;}

Java

 // Java program maximize the distance// between smallest and largest array// element by a single swapimport java.util.*; class GFG{ // Function to maximize the distance// between the smallest and largest// array element by a single swapstatic 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);} // Driver Codepublic static void main(String[] args){    int arr[] = { 1, 4, 3, 2 };    int N = arr.length;         System.out.print(find_max_dist(arr, N) + "\n");}} // This code is contributed by Amit Katiyar

Python3

 # Python3 program maximize the# distance between smallest# and largest array element# by a single swap # Function to maximize the distance# between the smallest and largest# array element by a single swapdef 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)) # Driver codearr = [ 1, 4, 3, 2 ]N = len(arr) print(find_max_dist(arr, N)) # This code is contributed by divyeshrabadiya07

C#

 // C# program maximize the distance// between smallest and largest array// element by a single swapusing System; class GFG{ // Function to maximize the distance// between the smallest and largest// array element by a single swapstatic 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);} // Driver Codepublic static void Main(String[] args){    int []arr = { 1, 4, 3, 2 };    int N = arr.Length;         Console.Write(find_max_dist(arr, N) + "\n");}} // This code is contributed by Amit Katiyar

Javascript


Output:
3

Time Complexity: O(N)

My Personal Notes arrow_drop_up