給你一個 n x n 的二進制網格 grid,每一次操作中,你可以選擇網格的 相鄰兩行 進行交換。
一個符合要求的網格需要滿足主對角線以上的格子全部都是 0 。
請你返回使網格滿足要求的最少操作次數,如果無法使網格符合要求,請你返回 -1 。
主對角線指的是從 (1, 1) 到 (n, n) 的這些格子。
代碼
class Solution {public int minSwaps(int[][] grid) {int n=grid.length,m=grid[0].length;LinkedList<Integer> list=new LinkedList<>();for(int i=0;i<n;i++)//計算右邊的連續0{int row=0;for(int j=m-1;j>=0;j--){if(grid[i][j]==1) break;row++;}list.add(row);}int ans=0;for(int i=0;i<n-1;i++)//最后一行任何情況都滿足,不需要計算{int ser=n-i-1;int j=0;for(;j<n;j++){if(list.get(j)>=ser){ans+=j-i;list.remove(j);//模擬交換list.addFirst(0);break;}}if(j==n) return -1;//找不到符合的}return ans;}
}