Open In App

Lexicographically smallest array formed by at most one swap for every pair of adjacent indices

Given an array A[] of length N, the task is to find lexicographically smallest array by swapping adjacent elements for each index atmost once. Thus, for any index: 



, at most one swap between A[K] and A[K+1] is allowed.
Example: 
 

Input: A[] = { 3, 2, 1, 4} 
Output: 1 3 2 4 
Explanation: Perform the following swaps: 
Swap A[1] and A[2], now A[] = { 3, 1, 2, 4 } 
Swap A[0] and A[1], now A[] = { 1, 3, 2, 4 } 
No further swaps are possible as A[1] and A[2] have already been swapped.
Input: A[] = { 2, 1, 4, 3, 6, 5 } 
Output: 1 2 3 4 5 6 
Explanation: Perform the following swaps: 
Swap A[0] and A[1], now A[] = { 1, 2, 4, 3, 6, 5 } 
Swap A[2] and A[3], now A[] = { 1, 2, 3, 4, 6, 5 } 
Swap A[4] and A[5], now A[] = { 1, 2, 3, 4, 5, 6 } 
 




 


Approach: 
To solve the problem mentioned above we can apply Greedy method. We know that we can perform at most N – 1 swaps to make the given array as smallest as possible. 
 


Below is the implementation of above approach:
 

// C++ implementation to find the
// lexicographically smallest
// array by at most single swap
// for every pair of adjacent indices
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the
// lexicographically smallest array
void findSmallestArray(int A[], int n)
{
    // maximum swaps possible
    int count = n - 1;
 
    // hash to store swaps performed
    map<pair<int, int>, int> mp;
 
    for (int i = 0; i < n && count > 0; ++i) {
 
        // let current element be
        // the minimum possible
        int mn = A[i], pos = i;
 
        // Find actual position of
        // the minimum element
        for (int j = i + 1; j < n; ++j) {
 
            // Update minimum element and
            // its position
            if (A[j] < mn) {
                mn = A[j];
                pos = j;
            }
        }
 
        // Perform swaps if possible
        while (pos > i && count > 0
               && !mp[{ pos - 1, pos }]) {
 
            // Insert current swap in hash
            mp[{ pos - 1, pos }] = 1;
 
            swap(A[pos], A[pos - 1]);
            --pos;
            --count;
        }
    }
 
    // print the required array
    for (int i = 0; i < n; ++i)
        cout << A[i] << " ";
}
 
// Driver code
int main()
{
 
    int A[] = { 2, 1, 4, 3, 6, 5 };
    int n = sizeof(A) / sizeof(A[0]);
 
    findSmallestArray(A, n);
 
    return 0;
}

                    
// Java implementation to find the
// lexicographically smallest
// array by at most single swap
// for every pair of adjacent indices
import java.util.*;
 
class GFG
{
 
  // Function to find the
  // lexicographically smallest array
  static void findSmallestArray(int[] A, int n)
  {
 
    // maximum swaps possible
    int count = n - 1;
 
    // hash to store swaps performed
    HashMap<String, Integer> mp
      = new HashMap<String, Integer>();
 
    for (int i = 0; i < n && count > 0; ++i) {
 
      // let current element be
      // the minimum possible
      int mn = A[i];
      int pos = i;
 
      // Find actual position of
      // the minimum element
      for (int j = i + 1; j < n; ++j) {
 
        // Update minimum element and
        // its position
        if (A[j] < mn) {
          mn = A[j];
          pos = j;
        }
      }
 
      // Perform swaps if possible
      while (pos > i && count > 0
             && !mp.containsKey(
               String.valueOf(pos - 1) + "#"
               + String.valueOf(pos))) {
 
        // Insert current swap in hash
        mp.put(String.valueOf(pos - 1) + "#"
               + String.valueOf(pos), 1);
 
        var temp = A[pos];
        A[pos] = A[pos - 1];
        A[pos - 1] = temp;
        --pos;
        --count;
      }
    }
 
    // print the required array
    for (int i = 0; i < n; ++i)
      System.out.print(A[i] + " ");
  }
 
  // Driver code
  public static void main(String[] args)
  {
 
    int[] A = { 2, 1, 4, 3, 6, 5 };
    int n = A.length;
 
    findSmallestArray(A, n);
  }
}
 
// This code is contributed by phasing17.

                    
# Python3 implementation to find the
# lexicographically smallest array by
# at most single swap for every pair
# of adjacent indices
 
# Function to find the
# lexicographically smallest array
def findSmallestArray(A, n):
     
    # Maximum swaps possible
    count = n - 1
 
    # Hash to store swaps performed
    mp = {''}
 
    for i in range(0, n):
        if(count <= 0):
            break;
 
        # Let current element be
        # the minimum possible
        mn = A[i]
        pos = i
 
        # Find actual position of
        # the minimum element
        for j in range(i + 1, n):
 
            # Update minimum element
            # and its position
            if (A[j] < mn):
                mn = A[j]
                pos = j
 
        # Perform swaps if possible
        while (pos > i and count > 0 and
             ((pos - 1, pos) not in mp)):
 
            # Insert current swap in hash
            mp.add((pos - 1, pos))
 
            A[pos], A[pos - 1] = A[pos - 1], A[pos]
            pos -= 1
            count -= 1
 
    # Print the required array
    for i in range(0, n):
        print(A[i], end = " ")
 
# Driver code
A = [ 2, 1, 4, 3, 6, 5 ]
n = len(A)
 
findSmallestArray(A, n)
 
# This code is contributed by Sanjit_Prasad

                    
// C# implementation to find the
// lexicographically smallest
// array by at most single swap
// for every pair of adjacent indices
using System;
using System.Collections.Generic;
 
class GFG
{
 
  // Function to find the
  // lexicographically smallest array
  static void findSmallestArray(int[] A, int n)
  {
     
    // maximum swaps possible
    int count = n - 1;
 
    // hash to store swaps performed
    Dictionary<string, int> mp
      = new Dictionary<string, int>();
 
    for (int i = 0; i < n && count > 0; ++i) {
 
      // let current element be
      // the minimum possible
      int mn = A[i];
      int pos = i;
 
      // Find actual position of
      // the minimum element
      for (int j = i + 1; j < n; ++j) {
 
        // Update minimum element and
        // its position
        if (A[j] < mn) {
          mn = A[j];
          pos = j;
        }
      }
 
      // Perform swaps if possible
      while (pos > i && count > 0
             && !mp.ContainsKey(
               Convert.ToString(pos - 1) + "#"
               + Convert.ToString(pos))) {
 
        // Insert current swap in hash
        mp[Convert.ToString(pos - 1) + "#"
           + Convert.ToString(pos)]
          = 1;
 
        var temp = A[pos];
        A[pos] = A[pos - 1];
        A[pos - 1] = temp;
        --pos;
        --count;
      }
    }
 
    // print the required array
    for (int i = 0; i < n; ++i)
      Console.Write(A[i] + " ");
  }
 
  // Driver code
  public static void Main(string[] args)
  {
 
    int[] A = { 2, 1, 4, 3, 6, 5 };
    int n = A.Length;
 
    findSmallestArray(A, n);
  }
}
 
// This code is contributed by phasing17.

                    
// JS implementation to find the
// lexicographically smallest
// array by at most single swap
// for every pair of adjacent indices
 
// Function to find the
// lexicographically smallest array
function findSmallestArray(A, n)
{
    // maximum swaps possible
    let count = n - 1;
 
    // hash to store swaps performed
    let mp = {};
 
    for (var i = 0; i < n && count > 0; ++i) {
 
        // let current element be
        // the minimum possible
        var mn = A[i], pos = i;
 
        // Find actual position of
        // the minimum element
        for (var j = i + 1; j < n; ++j) {
 
            // Update minimum element and
            // its position
            if (A[j] < mn) {
                mn = A[j];
                pos = j;
            }
        }
 
        // Perform swaps if possible
        while (pos > i && count > 0
               && !mp.hasOwnProperty(pos - 1 + "#" + pos)) {
 
            // Insert current swap in hash
            mp[ pos - 1 + "#" + pos] = 1;
             
            var temp = A[pos];
            A[pos] = A[pos - 1]
            A[pos - 1] = temp
            --pos;
            --count;
        }
    }
 
    // print the required array
    console.log(A.join(" "))
     
}
 
// Driver code
let A = [ 2, 1, 4, 3, 6, 5 ];
let n = A.length;
 
findSmallestArray(A, n);
 
// This code is contributed by phasing17

                    

Output: 
1 2 3 4 5 6

 

Time Complexity: O(N2)
 


Article Tags :