LeetCode861 翻轉矩陣後的得分(貪心)

2021-10-11 15:26:22 字數 1323 閱讀 1327

有乙個二維矩陣 a 其中每個元素的值為 0 或 1 。

移動是指選擇任一行或列,並轉換該行或列中的每乙個值:將所有 0 都更改為 1,將所有 1 都更改為 0

在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。

返回盡可能高的分數。

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

輸出:39

解釋:轉換為 [[1,1,1,1],[1,0,0,1],[1,1,1,1]]

貪心演算法

n*m的每個格仔都具有乙個權重,其中每一行權重都自左向右遞減, 為使總和最大則盡可能使權重大的格仔填「1」。

最後所有填「1」的格仔的權重和即為答案。

o(m*n)

class solution:

def matrixscore(self, a: list[list[int]]) -> int:

n, m = len(a), len(a[0]) # 行n,列m

# 通過行翻轉使左邊第一列全都置「1」

for i in range(n):

if a[i][0] == 0: # 如果左邊第一列有0

for j in range(m):

a[i][j] = 1 ^ a[i][j] # 此行進行「翻轉行」,異或^

sum = 0

# 後面就不能再使用行翻轉了,以免破環當前的結構, 所以考慮列翻轉

# 對於除最左邊第一列外的每一列,

# 總可以通過列翻轉使得該列「1」 的個數不小於「0」的個數。

# 最後所有填「1」的格仔的權重和即為答案

for i in zip(*a):

# print(i)

m -= 1

sum += 2 ** m * max(i.count(1), i.count(0)) # 2進製轉10進製

return sum

python中∧, 異或運算子,表示對於操作符兩側數字的二進位制數進行異或操作。異或操作的含義為:同一位置上的數字相等則得0,同一位置上的數字相異則得1。(二進位制表達中只有0,1兩個數字)

LeetCode 861 翻轉矩陣後的得分

有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。返回盡可能高的分數。示例 輸入 0,0,1,1 1...

861 翻轉矩陣後的得分

package com.heu.wsq.leetcode 861.翻轉矩陣後的得分 author wsq date 2020 12 7 有乙個二維矩陣 a 其中每個元素的值為 0 或 1 移動是指選擇任一行或列,並轉換該行或列中的每乙個值 將所有 0 都更改為 1,將所有 1 都更改為 0。在做出任...

861 翻轉矩陣後的得分

貪心 為了確保得到的值最大,陣列第一列必須是1,首先就可以對二維陣列的第一列不是1的記錄進行反轉,然後再處理列,每列中的1的個數大於一半,就進行反轉。這樣就能確保得到的值最大。這是第一次過題 對二維陣列進行了反轉,其實不用,只需要求值就可以了。class solution for int i 1 i...