Minimum number of moves to make a binary array K periodic
Last Updated :
15 Nov, 2022
Given a binary array arr[] (containing only 0s and 1s) and an integer K. The task is to find the minimum number of moves to make the array K-periodic.
An array is said to be K-periodic if the sub-arrays [1 to K], [k+1 to 2K], [2k+1 to 3K], … are all exactly same.
In a single move any 1 can be changed to a 0 or any 0 can be changed into a 1.
Examples:
Input: arr[] = {1, 1, 0, 0, 1, 1}, K = 2
Output: 2
The new array can be {1, 1, 1, 1, 1, 1}
Input: arr[] = {1, 0, 0, 0, 1, 0}, K = 2
Output: 1
The new array can be {1, 0, 1, 0, 1, 0}
Approach: For an array to be K-periodic. Consider indices i where i % K = X. All these indices must have the same value. So either the 1s can be converted to 0s or vice-versa. In order to reduce the number of moves, we choose the conversion which is minimum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minMoves( int n, int a[], int k)
{
int ct1[k] = { 0 }, ct0[k] = { 0 }, moves = 0;
for ( int i = 0; i < n; i++)
if (a[i] == 1)
ct1[i % k]++;
else
ct0[i % k]++;
for ( int i = 0; i < k; i++)
moves += min(ct1[i], ct0[i]);
return moves;
}
int main()
{
int k = 2;
int a[] = { 1, 0, 0, 0, 1, 0 };
int n = sizeof (a) / sizeof (a[0]);
cout << minMoves(n, a, k);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int minMoves( int n, int a[], int k)
{
int ct1[] = new int [k];
int ct0[] = new int [k];
int moves = 0 ;
for ( int i = 0 ; i < n; i++)
if (a[i] == 1 )
ct1[i % k]++;
else
ct0[i % k]++;
for ( int i = 0 ; i < k; i++)
moves += Math.min(ct1[i], ct0[i]);
return moves;
}
public static void main (String[] args)
{
int k = 2 ;
int a[] = { 1 , 0 , 0 , 0 , 1 , 0 };
int n = a.length;
System.out.println(minMoves(n, a, k));
}
}
|
Python3
def minMoves(n, a, k):
ct1 = [ 0 for i in range (k)]
ct0 = [ 0 for i in range (k)]
moves = 0
for i in range (n):
if (a[i] = = 1 ):
ct1[i % k] + = 1
else :
ct0[i % k] + = 1
for i in range (k):
moves + = min (ct1[i], ct0[i])
return moves
if __name__ = = '__main__' :
k = 2
a = [ 1 , 0 , 0 , 0 , 1 , 0 ]
n = len (a)
print (minMoves(n, a, k))
|
C#
using System;
class GFG
{
static int minMoves( int n, int [] a, int k)
{
int [] ct1 = new int [k];
int [] ct0 = new int [k];
int moves = 0;
for ( int i = 0; i < n; i++)
if (a[i] == 1)
ct1[i % k]++;
else
ct0[i % k]++;
for ( int i = 0; i < k; i++)
moves += Math.Min(ct1[i], ct0[i]);
return moves;
}
public static void Main ()
{
int k = 2;
int [] a = { 1, 0, 0, 0, 1, 0 };
int n = a.Length;
Console.WriteLine(minMoves(n, a, k));
}
}
|
PHP
<?php
function minMoves( $n , $a , $k )
{
$ct1 = array ();
$ct0 = array ();
$moves = 0;
for ( $i = 0; $i < $n ; $i ++)
if ( $a [ $i ] == 1)
$ct1 [ $i % $k ]++;
else
$ct0 [ $i % $k ]++;
for ( $i = 0; $i < $k ; $i ++)
$moves += min( $ct1 [ $i ], $ct0 [ $i ]);
return $moves ;
}
$k = 2;
$a = array (1, 0, 0, 0, 1, 0);
$n = sizeof( $a );
echo (minMoves( $n , $a , $k ));
|
Javascript
<script>
function minMoves(n, a, k)
{
let ct1 = new Uint8Array(k),
ct0 = new Uint8Array(k), moves = 0;
for (let i = 0; i < n; i++)
if (a[i] == 1)
ct1[i % k]++;
else
ct0[i % k]++;
for (let i = 0; i < k; i++)
moves += Math.min(ct1[i], ct0[i]);
return moves;
}
let k = 2;
let a = [ 1, 0, 0, 0, 1, 0 ];
let n = a.length;
document.write(minMoves(n, a, k));
</script>
|
Time Complexity: O(n + k), where n is the size of the given array and k is the given input.
Auxiliary Space: O(k), where k is the given input.
Share your thoughts in the comments
Please Login to comment...