Minimum flips to make all 1s in left and 0s in right | Set 2 - GeeksforGeeks

24 May, 2021
Given a binary array, we can flip all the 1 are in the left part and all the 0 to the right part.Calculate the minimum flips required to make all 1s in left and all 0s in right.Examples :  
Input: 1011000  
Output: 1
1 flip is required to make it 1111000.

Input : 00001 
Output : 2
2 flips required to make it 10000.
 
We have discussed a bitmask based solution in below post. Minimum flips to make all 1s in left and 0s in right | Set 1 (Using Bitmask)It can be done with O(N) time complexity (where N – number of bits) and O(N) extra memory  
Calculate number of flips of ‘0’ needed to be done while moving from left to right to have all ‘1’ in bits.Calculate number of flips of ‘1’ needed to be done while moving from right to left to have all ‘0’ in bits.Traversing through all positions between bits and find minimal sum of ‘0’-flips+’1′-flips from both arrays.
Calculate number of flips of ‘0’ needed to be done while moving from left to right to have all ‘1’ in bits.
Calculate number of flips of ‘1’ needed to be done while moving from right to left to have all ‘0’ in bits.
Traversing through all positions between bits and find minimal sum of ‘0’-flips+’1′-flips from both arrays.
 
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find minimum flips required// to make all 1s in left and 0s in right.#include <bits/stdc++.h>using namespace std; int minimalFilps(string bits){    int n = bits.length();     // two arrays will keep the count for number    // of 0s' and 1s' to be flipped while    // traversing from left to right and right to    // left respectively    int flipsFromLeft[n];    int flipsFromRight[n];     // Fill flipsFromLeft[]    int flips = 0;    for (int i = 0; i < n; i++) {        if (bits[i] == '0')            flips++;                flipsFromLeft[i] = flips;    }     // Fill flipsFromRight[]    flips = 0;    for (int i = n - 1; i >= 0; i--) {        if (bits[i] == '1')            flips++;                flipsFromRight[i] = flips;    }     // initialize minFlip to highest int value. If sum    // of leftflip and rightFlip is smaller than minflips,    // then update minFlips    int minFlips = INT_MAX;    for (int i = 1; i < n; i++) {        if (flipsFromLeft[i - 1] + flipsFromRight[i] < minFlips)            minFlips = flipsFromLeft[i - 1] + flipsFromRight[i];    }     return minFlips;} // Driver codeint main(){    string bits = "00001";    cout << minimalFilps(bits) << endl;    return 0;}
// Java program to find minimum flips required// to make all 1s in left and 0s in right.import java.io.*; class GFG{    static int minimalFilps(String bits)    {        int n = bits.length();             // two arrays will keep the count        // for number of 0s' and 1s' to be        // flipped while traversing from        // left to right and right to        // left respectively        int flipsFromLeft[] = new int[n];        int flipsFromRight[] =new int[n] ;             // Fill flipsFromLeft[]        int flips = 0;        for (int i = 0; i < n; i++)        {            if (bits.charAt(i) == '0')                flips++;                    flipsFromLeft[i] = flips;        }             // Fill flipsFromRight[]        flips = 0;        for (int i = n - 1; i >= 0; i--)        {            if (bits.charAt(i) == '1')                flips++;                    flipsFromRight[i] = flips;        }             // initialize minFlip to highest int value. If sum        // of leftflip and rightFlip is smaller than minflips,        // then update minFlips        int minFlips = Integer.MAX_VALUE;        for (int i = 1; i < n; i++)        {            if (flipsFromLeft[i - 1] + flipsFromRight[i]                                              < minFlips)                minFlips = flipsFromLeft[i - 1]                           + flipsFromRight[i];        }             return minFlips;    }         // Driver code    public static void main (String[] args)    {        String bits = "00001";        System.out.println(minimalFilps(bits));             }} // This code is contributed by vt_m.
# Python 3 program to find minimum flips required# to make all 1s in left and 0s in right.import sys def minimalFilps(bits):    n = len(bits)     # two arrays will keep the count for number    # of 0s' and 1s' to be flipped while    # traversing from left to right and right to    # left respectively    flipsFromLeft = [0 for i in range(n)]    flipsFromRight = [0 for i in range(n)]     # Fill flipsFromLeft[]    flips = 0    for i in range(0, n, 1):        if (bits[i] == '0'):            flips = flips + 1           flipsFromLeft[i] = flips         # Fill flipsFromRight[]    flips = 0    i = n - 1    while(i >= 0):        if (bits[i] == '1'):            flips = flips + 1        i = i - 1        flipsFromRight[i] = flips         # initialize minFlip to highest int value.    # If sum of leftflip and rightFlip is smaller    # than minflips, then update minFlips    minFlips = sys.maxsize    for i in range(1, n, 1):        if (flipsFromLeft[i - 1] +            flipsFromRight[i] < minFlips):            minFlips = (flipsFromLeft[i - 1] +                        flipsFromRight[i])         return minFlips # Driver codeif __name__ == '__main__':    bits = "00001"    print(minimalFilps(bits)) # This code is contributed by# Surendra_Gangwar
// C# program to find minimum flips required// to make all 1s in left and 0s in right.using System; class GFG{    static int minimalFilps(String bits)    {        int n = bits.Length;             // two arrays will keep the count        // for number of 0s' and 1s' to be        // flipped while traversing from        // left to right and right to        // left respectively        int []flipsFromLeft = new int[n];        int []flipsFromRight =new int[n] ;             // Fill flipsFromLeft[]        int flips = 0;        for (int i = 0; i < n; i++)        {            if (bits[i] == '0')                flips++;                    flipsFromLeft[i] = flips;        }             // Fill flipsFromRight[]        flips = 0;        for (int i = n - 1; i >= 0; i--)        {            if (bits[i] == '1')                flips++;                    flipsFromRight[i] = flips;        }             // initialize minFlip to highest int value.        // If sum of leftflip and rightFlip is smaller        // than minflips, then update minFlips        int minFlips = int.MaxValue;        for (int i = 1; i < n; i++)        {            if (flipsFromLeft[i - 1] + flipsFromRight[i] < minFlips)            minFlips = flipsFromLeft[i - 1] + flipsFromRight[i];        }             return minFlips;    }         // Driver code    public static void Main ()    {        string bits = "00001";        Console.WriteLine(minimalFilps(bits));             }} // This code is contributed by vt_m.
<?php// PHP program to find minimum// flips required to make all// 1s in left and 0s in right. function minimalFilps($bits){    $n = strlen($bits);     // two arrays will keep the    // count for number of 0s'    // and 1s' to be flipped    // while traversing from    // left to right and right    // to left respectively    $flipsFromLeft[$n] = 0;    $flipsFromRight[$n] = 0;     // Fill flipsFromLeft[]    $flips = 0;    for ($i = 0; $i < $n; $i++) {        if ($bits[$i] == '0')            $flips++;                $flipsFromLeft[$i] = $flips;    }     // Fill flipsFromRight[]    $flips = 0;    for ($i = $n - 1; $i >= 0; $i--)    {        if ($bits[$i] == '1')            $flips++;                $flipsFromRight[$i] = $flips;    }     // initialize minFlip to    // highest int value. If sum    // of leftflip and rightFlip    // is smaller than minflips,    // then update minFlips    $INT_MAX=2147483647;    $minFlips = $INT_MAX;    for ($i = 1; $i < $n; $i++)    {        if ($flipsFromLeft[$i - 1] +            $flipsFromRight[$i] < $minFlips)            $minFlips = $flipsFromLeft[$i - 1] +                        $flipsFromRight[$i];    }     return $minFlips;}     // Driver Code    $bits = "00001";    echo minimalFilps($bits) ; // This code is contributed by nitin mittal.?>
<script>    // Javascript program to find minimum flips required    // to make all 1s in left and 0s in right.         function minimalFilps(bits)    {        let n = bits.length;               // two arrays will keep the count        // for number of 0s' and 1s' to be        // flipped while traversing from        // left to right and right to        // left respectively        let flipsFromLeft = new Array(n);        flipsFromLeft.fill(0);        let flipsFromRight =new Array(n);        flipsFromRight.fill(0);               // Fill flipsFromLeft[]        let flips = 0;        for (let i = 0; i < n; i++)        {            if (bits[i] == '0')                flips++;                    flipsFromLeft[i] = flips;        }               // Fill flipsFromRight[]        flips = 0;        for (let i = n - 1; i >= 0; i--)        {            if (bits[i] == '1')                flips++;                    flipsFromRight[i] = flips;        }               // initialize minFlip to highest int value.        // If sum of leftflip and rightFlip is smaller        // than minflips, then update minFlips        let minFlips = Number.MAX_VALUE;        for (let i = 1; i < n; i++)        {            if (flipsFromLeft[i - 1] + flipsFromRight[i] < minFlips)                minFlips = flipsFromLeft[i - 1] + flipsFromRight[i];        }               return minFlips;    }         let bits = "00001";      document.write(minimalFilps(bits));   // This code is contributed by divyesh072019.</script>
Output:  
2
 
vt_m
nitin mittal
SURENDRA_GANGWAR
divyesh072019
binary-string
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Linked List vs Array
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Python | Using 2D arrays/lists the right way
Search an element in a sorted and rotated array
Queue | Set 1 (Introduction and Array Implementation)
Array of Strings in C++ (5 Different Ways to Create)