Given an array of 2 * N positive integers where each array element lies between 1 to N and appears exactly twice in the array. The task is to find the minimum number of adjacent swaps required to arrange all similar array elements together.
Note: It is not necessary that the final array (after performing swaps) should be sorted.
Examples:
Input: arr[] = { 1, 2, 3, 3, 1, 2 }
Output: 5After first swapping, array will be arr[] = { 1, 2, 3, 1, 3, 2 },
after second arr[] = { 1, 2, 1, 3, 3, 2 }, after third arr[] = { 1, 1, 2, 3, 3, 2 },
after fourth arr[] = { 1, 1, 2, 3, 2, 3 }, after fifth arr[] = { 1, 1, 2, 2, 3, 3 }Input: arr[] = { 1, 2, 1, 2 }
Output: 1
arr[2] can be swapped with arr[1] to get the required position.
Approach: This problem can be solved using greedy approach. Following are the steps :
- Keep an array visited[] which tells that visited[curr_ele] is false if swap operation has not been performed on curr_ele.
- Traverse through the original array and if the current array element has not been visited yet i.e. visited[arr[curr_ele]] = false, set it to true and iterate over another loop starting from the current position to the end of array.
- Initialize a variable count which will determine the number of swaps required to place the current element's partner at its correct position.
- In nested loop, increment count only if the visited[curr_ele] is false (since if it is true, means curr_ele has already been placed at its correct position).
- If the current element's partner is found in the nested loop, add up the value of count to the total answer.
Below is the implementation of above approach:
// C++ Program to find the minimum number of
// adjacent swaps to arrange similar items together
#include <bits/stdc++.h>
using namespace std;
// Function to find minimum swaps
int findMinimumAdjacentSwaps(int arr[], int N)
{
// visited array to check if value is seen already
bool visited[N + 1];
int minimumSwaps = 0;
memset(visited, false, sizeof(visited));
for (int i = 0; i < 2 * N; i++) {
// If the arr[i] is seen first time
if (visited[arr[i]] == false) {
visited[arr[i]] = true;
// stores the number of swaps required to
// find the correct position of current
// element's partner
int count = 0;
for (int j = i + 1; j < 2 * N; j++) {
// Increment count only if the current
// element has not been visited yet (if is
// visited, means it has already been placed
// at its correct position)
if (visited[arr[j]] == false)
count++;
// If current element's partner is found
else if (arr[i] == arr[j])
minimumSwaps += count;
}
}
}
return minimumSwaps;
}
// Driver Code
int main()
{
int arr[] = { 1, 2, 3, 3, 1, 2 };
int N = sizeof(arr) / sizeof(arr[0]);
N /= 2;
cout << findMinimumAdjacentSwaps(arr, N) << endl;
return 0;
}
// Java Program to find the minimum number of
// adjacent swaps to arrange similar items together
import java.util.*;
class solution
{
// Function to find minimum swaps
static int findMinimumAdjacentSwaps(int arr[], int N)
{
// visited array to check if value is seen already
boolean[] visited = new boolean[N + 1];
int minimumSwaps = 0;
Arrays.fill(visited,false);
for (int i = 0; i < 2 * N; i++) {
// If the arr[i] is seen first time
if (visited[arr[i]] == false) {
visited[arr[i]] = true;
// stores the number of swaps required to
// find the correct position of current
// element's partner
int count = 0;
for (int j = i + 1; j < 2 * N; j++) {
// Increment count only if the current
// element has not been visited yet (if is
// visited, means it has already been placed
// at its correct position)
if (visited[arr[j]] == false)
count++;
// If current element's partner is found
else if (arr[i] == arr[j])
minimumSwaps += count;
}
}
}
return minimumSwaps;
}
// Driver Code
public static void main(String args[])
{
int arr[] = { 1, 2, 3, 3, 1, 2 };
int N = arr.length;
N /= 2;
System.out.println(findMinimumAdjacentSwaps(arr, N));
}
}
// This code is contributed by
// Sanjit_Prasad
# Python3 Program to find the minimum number of
# adjacent swaps to arrange similar items together
# Function to find minimum swaps
def findMinimumAdjacentSwaps(arr, N) :
# visited array to check if value is seen already
visited = [False] * (N + 1)
minimumSwaps = 0
for i in range(2 * N) :
# If the arr[i] is seen first time
if (visited[arr[i]] == False) :
visited[arr[i]] = True
# stores the number of swaps required to
# find the correct position of current
# element's partner
count = 0
for j in range( i + 1, 2 * N) :
# Increment count only if the current
# element has not been visited yet (if is
# visited, means it has already been placed
# at its correct position)
if (visited[arr[j]] == False) :
count += 1
# If current element's partner is found
elif (arr[i] == arr[j]) :
minimumSwaps += count
return minimumSwaps
# Driver Code
if __name__ == "__main__" :
arr = [ 1, 2, 3, 3, 1, 2 ]
N = len(arr)
N //= 2
print(findMinimumAdjacentSwaps(arr, N))
# This code is contributed by Ryuga
// C# Program to find the minimum
// number of adjacent swaps to
// arrange similar items together
using System;
class GFG
{
// Function to find minimum swaps
static int findMinimumAdjacentSwaps(int []arr, int N)
{
// visited array to check
// if value is seen already
bool[] visited = new bool[N + 1];
int minimumSwaps = 0;
for (int i = 0; i < 2 * N; i++)
{
// If the arr[i] is seen first time
if (visited[arr[i]] == false)
{
visited[arr[i]] = true;
// stores the number of swaps required to
// find the correct position of current
// element's partner
int count = 0;
for (int j = i + 1; j < 2 * N; j++)
{
// Increment count only if the current
// element has not been visited yet (if is
// visited, means it has already been placed
// at its correct position)
if (visited[arr[j]] == false)
count++;
// If current element's partner is found
else if (arr[i] == arr[j])
minimumSwaps += count;
}
}
}
return minimumSwaps;
}
// Driver Code
public static void Main(String []args)
{
int []arr = { 1, 2, 3, 3, 1, 2 };
int N = arr.Length;
N /= 2;
Console.WriteLine(findMinimumAdjacentSwaps(arr, N));
}
}
// This code is contributed by PrinciRaj1992
<script>
// Javascript Program to find the minimum number of
// adjacent swaps to arrange similar items together
// Function to find minimum swaps
function findMinimumAdjacentSwaps(arr, N)
{
// visited array to check if value is seen already
let visited = Array(N + 1).fill(false);
let minimumSwaps = 0;
for (let i = 0; i < 2 * N; i++) {
// If the arr[i] is seen first time
if (visited[arr[i]] == false) {
visited[arr[i]] = true;
// stores the number of swaps required to
// find the correct position of current
// element's partner
let count = 0;
for (let j = i + 1; j < 2 * N; j++) {
// Increment count only if the current
// element has not been visited yet (if is
// visited, means it has already been placed
// at its correct position)
if (visited[arr[j]] == false)
count++;
// If current element's partner is found
else if (arr[i] == arr[j])
minimumSwaps += count;
}
}
}
return minimumSwaps;
}
// driver code
let arr = [ 1, 2, 3, 3, 1, 2 ];
let N = arr.length;
N = Math.floor(N / 2);
document.write(findMinimumAdjacentSwaps(arr, N));
</script>
Output
5
Complexity Analysis:
- Time Complexity: O(N2)
Auxiliary Space: O(N)