首頁>科技>

題目

給你一個 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,然後儲存在數組裡,這樣問題就轉換為變相的氣泡排序題目

5
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 工業網際網路能速成嗎?