Minimum Swaps to Arrange a Binary Grid

Medium
Watch on YouTube ↗

Solution

class Solution {
    public int minSwaps(int[][] grid) {
        int n = grid.length;
        int zeros[] = new int[n]; // O(n)
        // O(n^2)
        for(int i=0; i<n; i++) {
            int count  = 0;
            for(int j=n-1; j>=0; j--) {
                if(grid[i][j]==0)
                    count++;
                else break;
            }
            zeros[i] = count;
        }

        int swaps = 0;
        // O(n)*(n+n) = O(n^2)
        for(int i=0; i<n; i++) {
            int need = n-1-i;
            int j = i;
            while(j<n && zeros[j] < need)
                j++;
            if(j==n)
                return -1;
            while(j>i) {
                int temp = zeros[j];
                zeros[j] = zeros[j-1];
                zeros[j-1] = temp;
                swaps++;
                j--;
            }
        }
        return swaps;
    }
}