Skip to content
Related Articles

Related Articles

Maximize distance between smallest and largest Array elements by a single swap
  • Last Updated : 07 Jul, 2020

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:
Swappinf of arr[5] and arr[6] 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[0] increasing the distance by minIdx.
    • Swapping a[maxIdx] with a[N – 1] increasing the distance by N – 1 – maxIdx.

    Hence, maxIdx – minIdx + max(minIdx, N – 1 – maxIdx) gives us the required answer.

    Illustration:
    arr[] = {2, 4, 6, 1, 3, 5}
    Smallest element = 1
    Largest element = 6
    minIdx = 2
    maxIdx = 3
    Required Answer = maxIdx – minIdx + max(minIdx, N – 1 – maxIdx)
    = 3 – 2 + max(2, 5 – 3)
    = 1 + 2 = 3

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program maximize the
// distance between smallest
// and largest array element
// by a single swap
#include <bits/stdc++.h>
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[0]);
    cout << find_max_dist(arr, N) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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 =
                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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


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
Recommended Articles
Page :