題目
給你一個 n x n 的二進位制網格 grid,每一次操作中,你可以選擇網格的 相鄰兩行 進行交換。
一個符合要求的網格需要滿足主對角線以上的格子全部都是 0 。
請你返回使網格滿足要求的最少操作次數,如果無法使網格符合要求,請你返回 -1 。
主對角線指的是從 (1, 1) 到 (n, n) 的這些格子。
示例 1:輸入:grid = [[0,0,1],[1,1,0],[1,0,0]] 輸出:3
示例 2:輸入:grid = [[0,1,1,0],[0,1,1,0],[0,1,1,0],[0,1,1,0]] 輸出:-1
解釋:所有行都是一樣的,交換相鄰行無法使網格符合要求。
示例 3:輸入:grid = [[1,0,0],[1,1,0],[1,1,1]] 輸出:0
提示:n == grid.length
n == grid[i].length
1 <= n <= 200
grid[i][j] 要麼是 0 要麼是 1 。
解題思路分析1、遍歷+排序;時間複雜度O(n^2),空間複雜度O(n)
func minSwaps(grid [][]int) int { n := len(grid) arr := make([]int, n) for i := 0; i < n; i++ { count := 0 for j := n - 1; j >= 0; j-- { if grid[i][j] == 0 { count++ } else { break } } arr[i] = count } res := 0 for i := 0; i < n-1; i++ { if arr[i] >= n-1-i { // 滿足條件 continue } j := i for ; j < n; j++ { // 往後找 if arr[j] >= n-1-i { break } } if j == n { // 找不到 return -1 } for ; j > i; j-- { // 前移 arr[j], arr[j-1] = arr[j-1], arr[j] res++ } } return res}
總結Medium題目,先統計每行從後往前有多少連續0,然後儲存在數組裡,這樣問題就轉換為變相的氣泡排序題目
最新評論