We have a two dimensional matrix `A` where each value is `0` or `1`.

A move consists of choosing any row or column, and toggling each value in that row or column: changing all 0s to 1s, and all 1s to 0s.

After making any number of moves, every row of this matrix is interpreted as a binary number, and the score of the matrix is the sum of these numbers.

Return the highest possible score.

Example 1:

Input: [[0,0,1,1],[1,0,1,0],[1,1,0,0]]
Output: 39
Explanation: Toggled to [[1,1,1,1],[1,0,0,1],[1,1,1,1]].
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39

Note:

  1. 1 <= A.length <= 20
  2. 1 <= A[0].length <= 20
  3. A[i][j] is 0 or 1.

这道题给了我们一个只有0和1的二维数组,说是每一行代表一个数字,我们可以任意地翻转任意行和列,问如何能使得每一行代表的数字之和最大。在博主看来,这道题还是挺有意思的,因为你可以写的很复杂,但如果思路巧妙的话,也可以写的很简洁。当然最暴力的解法就是遍历所有的组合,对于一个 mxn 大小的矩阵,每一行都可以选择翻与不翻,同理,每一列也可以选择翻与不翻,那么总共就有 2^(m+n) 种情况,写起来比较复杂。

这道题最巧妙的解法是用贪婪算法 Greedy Algorithm 来解的,由于数字是由二进制表示的,那么最高位的权重是要大于其他位总和的,比如 1000 就要大于 0111 的,所以当最高位是0的时候,无论如何都是需要翻转当前行的,那么对于 mxn 的数组来说,每行的二进制数共有n位,最高位是1的话,就是 1<<(n-1),那么共有m行,所以至少能将 m*(1<<(n-1)) 这么大的值收入囊中,既然最高值一定要是1,那么每一行的翻转情况就确定了,若还想增大数字之和,就只能看各列是否还能翻转了,而且是从次高位列开始看,因为最高位列必须保证都是1。由于每一行的翻转情况已经确定了,那么如何才能确定其他位到底是0还是1呢,这里就有个 trick,此时就要看它跟最高位是否相同了,若相同的话,不管最高位初始时是0还是1,最终都要变成1,那么当前位一定最终也会变成1,而一旦跟最高位相反,那么最后一定会是0。我们翻转当前列的条件肯定是希望翻转之后1的个数要更多一些,这样值才能增加,所以就要统计每列当前的1的个数,若小于0的个数,才进行翻转,然后乘以该列的值,对于第j列,其值为 1<<(n-1-j),参见代码如下:

class Solution {
public:
int matrixScore(vector<vector<int>>& A) {
int m = A.size(), n = A[0].size(), res = (1 << (n - 1)) * m;
for (int j = 1; j < n; ++j) {
int cnt = 0;
for (int i = 0; i < m; ++i) {
cnt += (A[i][j] == A[i][0]);
}
res += max(cnt, m - cnt) * (1 << (n - 1 - j));
}
return res;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/861

参考资料:

https://leetcode.com/problems/score-after-flipping-matrix/

https://leetcode.com/problems/score-after-flipping-matrix/discuss/143722/C%2B%2BJavaPython-Easy-and-Concise

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

[LeetCode] Score After Flipping Matrix 翻转矩阵后的分数的更多相关文章

  1. LC 861. Score After Flipping Matrix

    We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...

  2. [Swift]LeetCode861. 翻转矩阵后的得分 | Score After Flipping Matrix

    We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...

  3. 【LeetCode】861. Score After Flipping Matrix 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  4. 861. Score After Flipping Matrix

    We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...

  5. LeetCode翻转矩阵后的得分-Python3<六>

    上一篇:LeetCode子域名访问计数-Python3.7<五> 题目:https://leetcode-cn.com/problems/score-after-flipping-matr ...

  6. LeetCode 中级 - 翻转矩阵后的得分(861)

    有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...

  7. LeetCode 861翻转矩阵后得分详细解法

    1. 题目内容 有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后 ...

  8. leetcode 861 翻转矩阵后的得分

    1. 题目描述 2.思路分析: 1. 首先这里的翻转分为了行翻转和列翻转,我们这里只需要求如何翻转后得到最大值,有点贪心的思想,因为最大值一定是固定的 至于是什么路径到达的最大值不是我们所关心的,我们 ...

  9. 【leetcode】861. Score After Flipping Matrix

    题目如下: 解题思路:本题需要知道一个数字规律,即pow(2,n) > sum(pow(2,0)+pow(2,1)+...+pow(2,n-1)).所以,为了获得最大值,要保证所有行的最高位是1 ...

随机推荐

  1. [Kubernetes]说说 Service 与 Ingress

    在 Kubernetes 中, Service 有三种对外暴露的方法,但是由于每个 Service 都要有一个负载均衡的服务,所以采用 Service 的话,会造成既浪费成本又高的现象.对于用户来说, ...

  2. JUC--ConcurrentHashMap

    HashMap HashTable HashTable锁住整个表 会存在复合操作上的问题“若不存则添加” “若存在则删除” 也是不安全的  效率低 ConcurrentHashMap:采用锁分段机制  ...

  3. Light OJ 1343 - Aladdin and the Black Stones

    题目 link 求偶数子序列 满足 的个数. 分析 首先, 我们先把每一对a[i] + a[j]存起来, 这样就可以把题目的偶数个条件无视了. 设 T[i,j] = a[i] + a[j]; 因为我们 ...

  4. springMVC上传

    1.页面 2.开始上传按钮对应的JS 3.添加文件按钮的方法,下图中1是从fast中取到的文件名称,2是文件图片的路径 下面就是后台的一些类.方法等 4.bean层,生成的get和set方法我就不写了 ...

  5. PHP斐波那契数列有点不明白有哪位大佬能给讲讲思想以及实现过程

    function Fibonacci($n){         if($n <= 0) {             return 0;         }elseif($n == 1) {    ...

  6. ProgressDialog替代

    在API level 26 中,ProgressDialog被声明不赞成使用,应使用的替代方法是ProgressBar 利用下列代码实现ProgressBar的出现和消失 progressBar.se ...

  7. Rest分页接口开发

    简单描述:需求说后端写一个XX数据的分页接口,给前端口调用,其实有一个PageHelper的工具类可以直接使用但是老大不让用,得用sql写,.小Kiss啦.直接上代码 代码: //Controller ...

  8. JS十种经典排序算法,纯动画演示,学会了怼死面试官!

    十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定 ...

  9. centos7设置httpd

    1.httpd开机自启动 systemctl enable httpd.service 2.httpd开机不自启动 systemctl disable httpd.service 3.启动httpd ...

  10. 下拉框、下拉控件之Select2。自动补全的使用

    参考链接: 参考一:https://blog.csdn.net/weixin_36146275/article/details/79336158 参考二:https://www.cnblogs.com ...