Minimize swaps to make remainder equal when an element and its index is divided by K
Last Updated :
16 Dec, 2021
Given an array arr[] of positive integers and a positive number K, the task is to find the minimum swaps of elements required such that for every element at index i, the following condition holds true:
arr[i] % K = i % K
Example:
Input: arr = {4, 3, 5, 2, 9, 7}, K=3
Output: 3
Explanation: Index % 3 = 0 1 2 0 1 2 and arr[i] % 3 = 1 0 2 2 0 1
swap index 0 with index 1 => 0 1 2 2 0 1
swap index 3 with index 4 => 0 1 2 0 2 1
swap index 4 with index 5 => 1 0 2 0 1 2
Input: arr = {0, 1, 2, 3, 4, 5}, K=1
Output: 0
Approach: The given problem can be solved using a greedy approach. The idea is to traverse the array and make swaps such that two elements are brought to their accurate positions if possible, or else the correct element is brought at the current position. Below steps can be followed to solve the problem:
- Check if it is possible to complete the task by comparing frequencies of index % k with element % k
- If the frequencies do not match then return -1
- Iterate the array and at every index i:
- If arr[i] % 3 == i % 3 then continue to the next index
- Else if arr[i] % 3 != i % 3 then find the index j from i+1 to N-1, where i % 3 = arr[j] % 3 and j % 3 = arr[i] % 3 that will bring two elements to their accurate positions
- Else find the index k, by iterating from i+1 to N-1, where i % 3 = arr[k] % 3, and swap the elements
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
void swapping( int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int CountMinSwaps( int arr[], int N, int K)
{
int mat[K][2] = { 0 };
int i, j, count = 0;
for (i = 0; i < N; i++) {
mat[i % K][0] += 1;
mat[arr[i] % K][1] += 1;
}
for (i = 0; i < K; i++) {
if (mat[i][0] != mat[i][1])
return -1;
}
for (i = 0; i < N; i++) {
if (i % K == arr[i] % K)
continue ;
int ind = i % K;
int ele = arr[i] % K;
bool swapped = false ;
for (j = i + 1; j < N; j++) {
int ind_exp = j % K;
int ele_exp = arr[j] % K;
if (ind == ele_exp
&& ele == ind_exp) {
swapping(arr, i, j);
swapped = true ;
count++;
break ;
}
}
if (swapped == false ) {
for (j = i + 1; j < N; j++) {
int ele_exp = arr[j] % K;
if (ind == ele_exp) {
swapping(arr, i, j);
count++;
break ;
}
}
}
}
return count;
}
int main()
{
int arr[6] = { 0, 1, 2, 3, 4, 5 };
int K = 1;
int N = sizeof (arr) / sizeof (arr[0]);
int swaps = CountMinSwaps(arr, N, K);
cout << swaps << endl;
}
|
Java
public class GFG {
static void swapping( int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static int CountMinSwaps( int arr[], int N, int K)
{
int mat[][] = new int [K][ 2 ] ;
int i, j, count = 0 ;
for (i = 0 ; i < N; i++) {
mat[i % K][ 0 ] += 1 ;
mat[arr[i] % K][ 1 ] += 1 ;
}
for (i = 0 ; i < K; i++) {
if (mat[i][ 0 ] != mat[i][ 1 ])
return - 1 ;
}
for (i = 0 ; i < N; i++) {
if (i % K == arr[i] % K)
continue ;
int ind = i % K;
int ele = arr[i] % K;
boolean swapped = false ;
for (j = i + 1 ; j < N; j++) {
int ind_exp = j % K;
int ele_exp = arr[j] % K;
if (ind == ele_exp
&& ele == ind_exp) {
swapping(arr, i, j);
swapped = true ;
count++;
break ;
}
}
if (swapped == false ) {
for (j = i + 1 ; j < N; j++) {
int ele_exp = arr[j] % K;
if (ind == ele_exp) {
swapping(arr, i, j);
count++;
break ;
}
}
}
}
return count;
}
public static void main (String[] args)
{
int arr[] = { 0 , 1 , 2 , 3 , 4 , 5 };
int K = 1 ;
int N = arr.length;
int swaps = CountMinSwaps(arr, N, K);
System.out.println(swaps);
}
}
|
Python3
def swapping(arr, i, j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
def CountMinSwaps(arr, N, K):
mat = [[ 0 for _ in range ( 2 )] for _ in range (K)]
count = 0
for i in range ( 0 , N):
mat[i % K][ 0 ] + = 1
mat[arr[i] % K][ 1 ] + = 1
for i in range ( 0 , K):
if (mat[i][ 0 ] ! = mat[i][ 1 ]):
return - 1
for i in range ( 0 , N):
if (i % K = = arr[i] % K):
continue
ind = i % K
ele = arr[i] % K
swapped = False
for j in range (i + 1 , N):
ind_exp = j % K
ele_exp = arr[j] % K
if (ind = = ele_exp and ele = = ind_exp):
swapping(arr, i, j)
swapped = True
count + = 1
break
if (swapped = = False ):
for j in range (i + 1 , N):
ele_exp = arr[j] % K
if (ind = = ele_exp):
swapping(arr, i, j)
count + = 1
break
return count
if __name__ = = "__main__" :
arr = [ 0 , 1 , 2 , 3 , 4 , 5 ]
K = 1
N = len (arr)
swaps = CountMinSwaps(arr, N, K)
print (swaps)
|
C#
using System;
public class GFG
{
static void swapping( int [] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static int CountMinSwaps( int [] arr, int N, int K)
{
int [,] mat = new int [K, 2];
int i, j, count = 0;
for (i = 0; i < N; i++)
{
mat[i % K, 0] += 1;
mat[arr[i] % K, 1] += 1;
}
for (i = 0; i < K; i++)
{
if (mat[i, 0] != mat[i, 1])
return -1;
}
for (i = 0; i < N; i++)
{
if (i % K == arr[i] % K)
continue ;
int ind = i % K;
int ele = arr[i] % K;
bool swapped = false ;
for (j = i + 1; j < N; j++)
{
int ind_exp = j % K;
int ele_exp = arr[j] % K;
if (ind == ele_exp
&& ele == ind_exp)
{
swapping(arr, i, j);
swapped = true ;
count++;
break ;
}
}
if (swapped == false )
{
for (j = i + 1; j < N; j++)
{
int ele_exp = arr[j] % K;
if (ind == ele_exp)
{
swapping(arr, i, j);
count++;
break ;
}
}
}
}
return count;
}
public static void Main()
{
int [] arr = { 0, 1, 2, 3, 4, 5 };
int K = 1;
int N = arr.Length;
int swaps = CountMinSwaps(arr, N, K);
Console.Write(swaps);
}
}
|
Javascript
<script>
function swapping(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function CountMinSwaps(arr, N, K) {
let mat = new Array(K);
for (let i = 0; i < mat.length; i++) {
mat[i] = new Array(2).fill(0);
}
let i, j, count = 0;
for (i = 0; i < N; i++) {
mat[i % K][0] += 1;
mat[arr[i] % K][1] += 1;
}
for (i = 0; i < K; i++) {
if (mat[i][0] != mat[i][1])
return -1;
}
for (i = 0; i < N; i++) {
if (i % K == arr[i] % K)
continue ;
let ind = i % K;
let ele = arr[i] % K;
let swapped = false ;
for (j = i + 1; j < N; j++) {
let ind_exp = j % K;
let ele_exp = arr[j] % K;
if (ind == ele_exp
&& ele == ind_exp) {
swapping(arr, i, j);
swapped = true ;
count++;
break ;
}
}
if (swapped == false ) {
for (j = i + 1; j < N; j++) {
let ele_exp = arr[j] % K;
if (ind == ele_exp) {
swapping(arr, i, j);
count++;
break ;
}
}
}
}
return count;
}
let arr = [0, 1, 2, 3, 4, 5];
let K = 1;
let N = arr.length;
let swaps = CountMinSwaps(arr, N, K);
document.write(swaps + '<br>' );
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(2 * K)
Share your thoughts in the comments
Please Login to comment...