Aug 2nd, 2024
   
   
    sliding window
   
    
    
    
    
     Edit me
    
   #. Problem
1. My approach
At the end of the process, all the 1’s will be grouped together, and the rest are 0’s
Therefore, eventually, this problem is to find a subset that is size of x, and has the smallest numbers of 0’s.
x is the total number of 1’s in the array.
Not very optimal on readability, but here it is:
/**
 * @param {number[]} nums
 * @return {number}
 */
var minSwaps = function(nums) {
    const zeros = nums.filter(el => el === 0).length;
    const ones = nums.length-zeros;
    let minGap = nums.length;
    for(let i = 0; i < nums.length; i++){
        let tempGap = 0;
        for(let j = i, count = 0; count < ones; count++, j = j < nums.length-1? j+1:0){
            if(nums[j] === 0) tempGap++;
        }
        minGap = Math.min(tempGap, minGap);
    }
    return minGap;
};
Time limit error for the possible O(n^2) solution.
2. Solution (Sliding window)
/**
 * @param {number[]} nums
 * @return {number}
 */
var minSwaps = function(nums) {
    const zeros = nums.filter(el => el === 0).length;
    const ones = nums.length-zeros;
    // Check how many 0's in the first subset
    let zeroCount = 0;
    for(let i = 0; i < ones; i++){
        if(nums[i] === 0) zeroCount++;
    }
    let currentZeroCnt = zeroCount;
    for(let i = 1; i < nums.length; i++){
        const j = ((i + ones - 1) % nums.length);
        
        /**
         * Sliding window:
         * Moving the window(subset) to the right, 
         * checking how many 0's are in the window.
         */
        if(nums[j] === 0) currentZeroCnt++;
        if(nums[i-1] === 0) currentZeroCnt--;
        zeroCount = Math.min(currentZeroCnt, zeroCount);
    }
    return zeroCount;
};
| Time - O(n) | Space - O(1) | 
|---|---|
| 83 ms | 60 MB | 
3. Epilogue
What I’ve learned from this exercise:
- Fresh mind, focus!