Related Articles
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 swap``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);``}` `// Driver Code``int` `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 swap``import` `java.util.*;` `class` `GFG{` `// Function to maximize the distance``// between the smallest and largest``// array element by a single swap``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);``}` `// Driver Code``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"``);``}``}` `// 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 swap``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))` `# Driver code``arr ``=` `[ ``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 swap``using` `System;` `class` `GFG{` `// Function to maximize the distance``// between the smallest and largest``// array element by a single swap``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);``}` `// Driver Code``public` `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)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up