[LeetCode] 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 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 <= A.length <= 201 <= A[0].length <= 20A[i][j]is0or1.
这道题给了我们一个只有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/
[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)
[LeetCode] Score After Flipping Matrix 翻转矩阵后的分数的更多相关文章
- 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 ...
- [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 ...
- 【LeetCode】861. Score After Flipping Matrix 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 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 ...
- LeetCode翻转矩阵后的得分-Python3<六>
上一篇:LeetCode子域名访问计数-Python3.7<五> 题目:https://leetcode-cn.com/problems/score-after-flipping-matr ...
- LeetCode 中级 - 翻转矩阵后的得分(861)
有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...
- LeetCode 861翻转矩阵后得分详细解法
1. 题目内容 有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后 ...
- leetcode 861 翻转矩阵后的得分
1. 题目描述 2.思路分析: 1. 首先这里的翻转分为了行翻转和列翻转,我们这里只需要求如何翻转后得到最大值,有点贪心的思想,因为最大值一定是固定的 至于是什么路径到达的最大值不是我们所关心的,我们 ...
- 【leetcode】861. Score After Flipping Matrix
题目如下: 解题思路:本题需要知道一个数字规律,即pow(2,n) > sum(pow(2,0)+pow(2,1)+...+pow(2,n-1)).所以,为了获得最大值,要保证所有行的最高位是1 ...
随机推荐
- 【转】Python函数默认参数陷阱
[转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...
- MVC或WebAPI发布后报错404问题的总结
在MVC项目或者webAPI项目发布之后有时会发生404错误.针对这种错误的解决办法: 解决办法1(不推荐):在webconfig中 <system.webServer> 节点下 添加 & ...
- 小程序如何传数组数据到vs后台中
首先小程序要跟vs运行的状态打通,首先要修改配置,也就是说调试的时候,小程序一使用Post请求后台的方法时就能让vs进入调试状态. 1.修改vs中的配置,注意这个.vs文件,如图: 找到这个文件 然后 ...
- 对oracle用户创建asm磁盘
--root用户执行vi /etc/sysctl.conf #Install oracle settingfs.aio-max-nr = 1048576fs.file-max = 6815744#ke ...
- SpringBoot参数注解
1.@RequestParam有无区别 1.1 @GetMapping("/name/id")public Result managerNameIsRepeat(@RequestP ...
- git 服务器 LINUX端的使用
首先,需要建立一个git服务器----- 这里介绍如何使用git这个服务器 我们在github上下载一份代码,里面有如下内容 我们使用git服务器的时候不能有.git 文件,所以在此将其删除 ys-l ...
- selenium打开Chrome浏览器并最大化
#打开Chrome浏览器并放大 from selenium import webdriver def BrowserOpen(): driver = webdriver.Chrome(); drive ...
- 项目实战-使用PySpark处理文本多分类问题
原文链接:https://cloud.tencent.com/developer/article/1096712 在大神创作的基础上,学习了一些新知识,并加以注释. TARGET:将旧金山犯罪记录(S ...
- 【玩转开源】Linux C 检测网口热插拔
int NetDetect(char *net_name, int *statue) { int ret = 0; ; struct ifreq ifr; skfd = socket(AF_INET, ...
- Redis实战 - 3.Hash
hash Redis的Hash有点像一个对象(object),一个Hash里面可以存多个Key-Value对作为它的field,所以它通常可以用来表示对象. Hash里面能存放的值也能作为String ...