Skip to content

Array: Max Set Bit

Mani Bhushan edited this page Aug 15, 2016 · 2 revisions

You are given an integer array with N elements: d[0], d[1], ... d[N - 1]. You can perform AT MOST one move on the array: choose any two integers [L, R], and flip all the elements between (and including) the L-th and R-th bits. L and R represent the left-most and right-most index of the bits marking the boundaries of the segment which you have decided to flip.

What is the maximum number of '1'-bits (indicated by S) which you can obtain in the final bit-string?

'Flipping' a bit means, that a 0 is transformed to a 1 and a 1 is transformed to a 0 (0->1,1->0). Input Format An integer N Next line contains the N bits, separated by spaces: d[0] d[1] ... d[N - 1]

Output: S

Constraints:
1 <= N <= 100000
d[i] can only be 0 or 1
0 <= L <= R < n

Sample Input:
8
1 0 0 1 0 0 1 0

Sample Output:
6

We can get a maximum of 6 ones in the given binary array by performing either of the following operations: Flip [1, 5] ==> 1 1 1 0 1 1 1 0

High Level Approach:

Lets use a modified Kadane's implementation where we check for the maximum negative sum. To check for maximum negative sum we treat all 0 bits as -1.

  • Time Complexity: O(n)
  • Space Complexity: O(1)

Working Solution:

MaxSetBits.java

Send me a pull request if you feel this solution can be improved further.

Clone this wiki locally