861. 翻转矩阵后的得分(JavaScript)
程序员文章站
2022-07-12 12:29:28
...
有一个二维矩阵 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、首先要把第一列全部变为1,即若某一行的第一个元素为0,则把这一行进行翻转(0变1,1变0)
2、逐列判断,如果某一列的0的个数大于行数的一半(或1的个数小于一半),则把这一列进行翻转。
/**
* @param {number[][]} A
* @return {number}
*/
var matrixScore = function(A) {
function reverse(array) { // 翻转数组,0变1,1变0
for (let i in array) {
array[i] ^= 1
}
}
let row = A.length,
col = A[0].length,
result = 0
for (let array of A) {
if (array[0] === 0) reverse(array) // 每一行的第一个元素一定要为1,才能最大化
}
for (let j = 0; j < col; j++) { // 遍历,看是否有列需要翻转
let count = 0
for (let i = 0; i < row; i++) {
count += A[i][j]
}
if (count < row / 2) { // 如果某一列1的个数小于行数,则这一列需要翻转
for (let i = 0; i < row; i++) {
A[i][j] ^= 1
}
}
}
for (let array of A) {
result += parseInt(array.join(''), 2)
}
return result
};