1. 程式人生 > 其它 >【LeetCode&python】861. 翻轉矩陣後的得分

【LeetCode&python】861. 翻轉矩陣後的得分

題目

有一個二維矩陣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))