【LeetCode&python】861. 翻轉矩陣後的得分
阿新 • • 發佈:2021-12-30
題目
有一個二維矩陣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]]
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
思路
一開始學機器學習學傻了,竟然想用啟發式來做,遍歷每行每列,如果對行進行"移動"後該行值變大,或者對列進行"移動"後整體變大,那麼就保留該操作,直到整體收斂 哭o(╥﹏╥)o
後來想到是貪心
對行進行“操作”的前提是使得行的值變大,而對於二進位制計算值而言,首位為1時最大,如果再逆轉,那麼首位不為1的話,一定會變小
所以對行操作為保證首位為1
隨後對列進行“操作”的前提是使得整體的值變大,而對列進行逆轉,只會改變某行第i位的值,而每行第i位對整體的貢獻的一樣的
所以只需要保證第i位的1變多,那麼整體就會變大
實現上的細節
列表表示式和條件表示式非常實用
grid[i] = [0 if (value == 1) else 1 for value in temp]
grid[i][j] = 0 if (grid[i][j] == 1) else 1
將二進位制字串轉為十進位制數
int(binary_str,2)
python實現
from typing import List class Solution: def matrixScore(self, grid: List[List[int]]) -> int: """ 貪心 先按照行遍歷,將1儘可能放到左面,保證最左面的一定為1 再按照列遍歷,保證列上儘可能多的1 """ max_value = 0 # 對行操作 for i in range(len(grid)): if (grid[i][0] == 0): temp = grid[i] grid[i] = [0 if (value == 1) else 1 for value in temp] # 對列操作 for j in range(len(grid[0])): counter_1 = 0 counter_0 = 0 for i in range(len(grid)): if (grid[i][j] == 1): counter_1 += 1 else: counter_0 += 1 if (counter_1 < counter_0): for i in range(len(grid)): grid[i][j] = 0 if (grid[i][j] == 1) else 1 # 求和 for i in range(len(grid)): temp = [str(v) for v in grid[i]] binary_str = "".join(temp) binary_int = int(binary_str,2) max_value+=binary_int return max_value # Press the green button in the gutter to run the script. if __name__ == '__main__': input_value=[[0,0,1,1],[1,0,1,0],[1,1,0,0]] s=Solution() print(s.matrixScore(input_value))