題目
有一個二維矩陣 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
提示:1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j] 是 0 或 1
解題思路分析1、遍歷;時間複雜度O(n^2),空間複雜度O(1)
func matrixScore(A [][]int) int { var res int if len(A) == 0 || len(A[0]) == 0 { return 0 } // 翻轉行,每行第一個為0則翻轉 for i := 0; i < len(A); i++ { if A[i][0] == 0 { for j := 0; j < len(A[i]); j++ { A[i][j] = 1 - A[i][j] } } } // 翻轉列,每列1的數量大於0則翻轉 for j := 0; j < len(A[0]); j++ { a, b := 0, 0 for i := 0; i < len(A); i++ { if A[i][j] == 0 { a++ } else { b++ } } if a <= b { continue } for i := 0; i < len(A); i++ { A[i][j] = 1 - A[i][j] } } for i := 0; i < len(A); i++ { sum := 0 for j := 0; j < len(A[i]); j++ { sum = sum*2 + A[i][j] } res = res + sum } return res}
2、遍歷;時間複雜度O(n^2),空間複雜度O(1)
func matrixScore(A [][]int) int { var res int if len(A) == 0 || len(A[0]) == 0 { return 0 } n := len(A) m := len(A[0]) // 首先每行第一個都為1求和,n個長度為m的1x...x // 這樣保證第一列全為1 res = res + n*(1<<(m-1)) for j := 1; j < m; j++ { a, b := 0, 0 for i := 0; i < n; i++ { if A[i][0] == 0 && A[i][j] == 0 { // 需要翻轉 b++ } else if A[i][0] == 1 && A[i][j] == 1 { // 不需要翻轉 b++ } else { a++ } } // 1比0多,不需要翻轉 if a <= b { res = res + b*(1<<(m-1-j)) } else { res = res + a*(1<<(m-1-j)) } } return res}
總結
Medium題目,為了最大,每行第一個為0則翻轉每行,每列1的數量大於0的數量則翻轉