Minimum Swaps to Group All 1's Together

medium sliding window binary array counting

Problem

Given a binary array data, return the minimum number of swaps required to group all 1's present in the array together in any place in the array. A swap exchanges the values of any two positions.

Inputdata = [1, 0, 1, 0, 1]
Output1
There are three 1's. Any window of length 3 holds at most two 1's, so we swap once to fill the remaining slot.

def min_swaps(data):
    k = sum(data)
    if k == 0:
        return 0
    ones = sum(data[:k])
    best = ones
    for i in range(k, len(data)):
        ones += data[i] - data[i - k]
        best = max(best, ones)
    return k - best
function minSwaps(data) {
  const k = data.reduce((a, b) => a + b, 0);
  if (k === 0) return 0;
  let ones = 0;
  for (let i = 0; i < k; i++) ones += data[i];
  let best = ones;
  for (let i = k; i < data.length; i++) {
    ones += data[i] - data[i - k];
    best = Math.max(best, ones);
  }
  return k - best;
}
class Solution {
    public int minSwaps(int[] data) {
        int k = 0;
        for (int v : data) k += v;
        if (k == 0) return 0;
        int ones = 0;
        for (int i = 0; i < k; i++) ones += data[i];
        int best = ones;
        for (int i = k; i < data.length; i++) {
            ones += data[i] - data[i - k];
            best = Math.max(best, ones);
        }
        return k - best;
    }
}
int minSwaps(vector<int>& data) {
    int k = 0;
    for (int v : data) k += v;
    if (k == 0) return 0;
    int ones = 0;
    for (int i = 0; i < k; i++) ones += data[i];
    int best = ones;
    for (int i = k; i < (int)data.size(); i++) {
        ones += data[i] - data[i - k];
        best = max(best, ones);
    }
    return k - best;
}
Time: O(n) Space: O(1)