 Open in App
Not now

# 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:
Explanation:
Swapping of arr and arr maximizes the distance.

Input: arr[] = {1, 6, 5, 3, 4, 7, 2}
Output:
Explanation:
Swapping 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)
Auxiliary space: O(1) as it is using constant space for variable

My Personal Notes arrow_drop_up
Related Articles