LeetCode 變為棋盤

2021-09-22 07:50:19 字數 1894 閱讀 9231

乙個 n x n的 board 僅由 0 和 1 組成 。每次移動,你能任意交換兩列或是兩行的位置。

輸出將這個矩陣變為 「棋盤」 所需的最小移動次數。「棋盤」 是指任意一格的上下左右四個方向的值均與本身不同的矩陣。如果不存在可行的變換,輸出 -1。

示例:

輸入: board = [[0,1,1,0],[0,1,1,0],[1,0,0,1],[1,0,0,1]]

輸出: 2

解釋:一種可行的變換方式如下,從左到右:

0110 1010 1010

0110 --> 1010 --> 0101

1001 0101 1010

1001 0101 0101

第一次移動交換了第一列和第二列。

第二次移動交換了第二行和第三行。

輸入: board = [[0, 1], [1, 0]]

輸出: 0

解釋:注意左上角的格值為0時也是合法的棋盤,如:

0110

也是合法的棋盤.

輸入: board = [[1, 0], [1, 0]]

輸出: -1

解釋:任意的變換都不能使這個輸入變為合法的棋盤。

board 是方陣,且行列數的範圍是[2, 30]。

board[i][j] 將只包含 0或 1。

思路分

析:\color

思路分析

:這道題我們首先需要判斷這個矩陣能不能通過變換得到棋盤,然後再考慮最小的步數變為棋盤。

0 1 0 1

1 0 1 0

0 1 0 1

1 0 1 0

或者1 0 1 0

0 1 0 1

1 0 1 0

0 1 0 1

0 1 0 1 0

1 0 1 0 1

0 1 0 1 0

1 0 1 0 1

0 1 0 1 0

或者1 0 1 0 1

0 1 0 1 0

1 0 1 0 1

0 1 0 1 0

1 0 1 0 1

判斷規律:

以[0,0]為左上角的任意乙個矩形的四個頂點只有三種情況,要麼四個0,要麼四個1,要麼兩個0兩個1。即四個頂點異或在一起一定是0

每行的1的個數要麼為 n/2,要麼為 (n+1)/2。統計完了首行首列1的個數,我們判斷如果其小於 n/2 或者大於 (n+1) / 2,那麼一定無法轉為棋盤

class

solution}}

//同時掃瞄第一行、第一列

for(

int i =

0; i < n;

++i)

//檢測第一行中1的個數i和零的個數j是否滿足j + 1 >= i >= j -1

if(n /

2> rowsum || rowsum >

(n +1)

/2)//檢測第一列中1的個數i和零的個數j是否滿足j + 1 >= i >= j -1

if(n /

2> colsum || colsum >

(n +1)

/2)//下分n的奇偶性計算需要調整的最小步數,分行調整、列調整

LeetCode 將資料流變為多個不相交區間

給定乙個非負整數的資料流輸入 a1,a2,an,將到目前為止看到的數字總結為不相交的區間列表。例如,假設資料流中的整數為 1,3,7,2,6,每次的總結為 1,1 1,1 3,3 1,1 3,3 7,7 1,3 7,7 1,3 6,7 高階 如果有很多合併,並且與資料流的大小相比,不相交區間的數量很...

變為回文串

我們現在給你乙個字串,我們規定只能在這個字串的右邊新增字元,問最少新增多少字元可以使這個字串變為回文串?第一行乙個正整數t 10代表測試資料個數 每組測試資料給出乙個字串s,保證 s 1000000,且只包含小寫字母 對每組測試資料,輸出最少需要新增的字元的個數3ab abaabad10 3 inc...

站點變為黑白

專案接近尾聲了,前幾天在測試的時候發現,在某個win7電腦的ie上。站點居然變成了黑白的。我的電腦是win8的系統,用ie測,更改各種文件模式均正常。令人費解。找不到原因。更改瀏覽器的各種設定,均沒有效果。上網搜資料的時候發現,非常多站點為了紀念大 或者其它日子的時候會有益把站點站點變成黑白的。沒有...