LeetCode 861翻转矩阵后得分详细解法
1. 题目内容
有一个二维矩阵 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 <= 201 <= A[0].length <= 20A[i][j]是0或1
2. 分析
此题是被分类到贪心算法, 所以解决思路就是利用贪心算法, 因为矩阵可以把任意一行或者任意一列的数全部取反, 而要求取得最大的矩阵和。
求矩阵和的求法 是把每一行的二进制变成10进制, 这就有一个特性: 每一行的第一位为1 要 产生的效益比 它的下面的位之和为1产生的效益要大。 而我可以通过矩阵移动把第一行的第一位都变成1, 这样产生的效益是最大的。
当第一位都为1时,下面考虑每一列的数字, 对于除了第一列的其他列, 当这一列的1的个数小于0, 则可以通过列移动(取反)使得1的个数大于0, 这是产生的效益是最大的, 而且每一列的交换不会对前面的列或者后面的列产生影响当处理完最后一行 此时得到的矩阵就是 值最大的矩阵了
所以一共做的处理有两组
- 第一组处理第一列, 让第一列全变成1, 这样得到此时的最大
- 第二组 处理随后的列数让里面的1的个数 大于 0, 得到此时的最大
当处理完全部的列数 因为每一次处理完 都要比原来的值大,而且所有的处理都已完成, 此时的矩阵就是最大值的矩阵。
3.代码实现
class Solution {
public:
int matrixScore(vector<vector<int>>& A) {
int row = A.size();
int col = A[0].size();
int zeroCount = 0, sum = 0;
//处理第一列 把它变成
for (int i = 0; i < row; i++) {
if (A[i][0] == 0) {
for (int j = 0; j < col; j++) {
A[i][j] = A[i][j] ^ 1;
}
}
}
for (int j = 0; j < col; j++) {
//每一列的0个数
zeroCount = 0;
for (int i = 0; i < row; i++) {
if (A[i][j] == 0) {
zeroCount++;
}
}
//0个数多 就对此列交换
if (zeroCount > row/2) {
for (int i = 0; i < row; i++) {
A[i][j] = A[i][j] ^ 1;
}
}
}
//计算结果
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
sum += pow(2, col - j - 1) * A[i][j];
}
}
return sum;
}
};
代码可以更加简化 , 因为我只是需要得到一个值, 不需要得到矩阵, 可以直接通过规律来计算
代码来自 https://leetcode.com/problems/score-after-flipping-matrix/discuss/143722/C++JavaPython-Easy-and-Concise
int matrixScore(vector<vector<int>> A) {
//res 开始就是 把第一列的1 全部计算起来 (1 << (N - 1)) * M
int M = A.size(), N = A[0].size(), res = (1 << (N - 1)) * M;
for (int j = 1; j < N; j++) {
int cur = 0;
for (int i = 0; i < M; i++) cur += A[i][j] == A[i][0];
//计算其他列 max(cur, M - cur)表示1的个数
res += max(cur, M - cur) * (1 << (N - j - 1));
}
return res;
}
4. 总结
- 找到题目特性, 找到能贪心的点
5. 学习贪心算法
LeetCode 861翻转矩阵后得分详细解法的更多相关文章
- leetcode 861 翻转矩阵后的得分
1. 题目描述 2.思路分析: 1. 首先这里的翻转分为了行翻转和列翻转,我们这里只需要求如何翻转后得到最大值,有点贪心的思想,因为最大值一定是固定的 至于是什么路径到达的最大值不是我们所关心的,我们 ...
- LeetCode 中级 - 翻转矩阵后的得分(861)
有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...
- LeetCode翻转矩阵后的得分-Python3<六>
上一篇:LeetCode子域名访问计数-Python3.7<五> 题目:https://leetcode-cn.com/problems/score-after-flipping-matr ...
- [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] 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] Random Flip Matrix 随机翻转矩阵
You are given the number of rows n_rows and number of columns n_cols of a 2D binary matrix where all ...
- Java实现 LeetCode 519 随机翻转矩阵
519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...
- C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- yzoi2226最小步数的详细解法
Description - 问题描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字. ...
随机推荐
- 第十章:Android消息机制
Android的消息机制主要是指Handler的云心机制,Handler的运行需要底层的MessageQueue和Looper支持. Handler是Android消息机制的上层接口. 通过Handl ...
- Ethical Hacking - GAINING ACCESS(17)
CLIENT SIDE ATTACKS - Backdooring exe' s Download an executable file first. VEIL - FRAMEWORK A backd ...
- OSCP Learning Notes - Exploit(1)
Gaining Root with Metasploit Platform: Kali Linux, Kioptrix Level 1 1. Find the IP of Kioptirx nmap ...
- P1050 精卫填海
[问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺而不返,故为精卫.常衔西山之木石,以堙于东海.——<山海经&g ...
- patelinux 安装
参考文档:https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_2/ug1144-petalinux-tools-r ...
- 雨云CDN - 好用的CDN服务
注册雨云 点我 创建CDN 解析CDN 解析完后去试试快了吗?
- 切换npm源的几种方法
我们在使用官方提供的npm源安装各种依赖包的时候,下载速度会很慢,通常需要更换npm源. 我们可以在终端中输入命令 npm config list 来查看 npm 源地址,默认地址为 metrics- ...
- Android Studio常见问题集锦
Android studio无法在可视化页面预览XML布局文件 修改res/values/styles.xml文件中name=“AppTheme”的style,在Theme.AppCompat.Lig ...
- vue学习(十八)使用自定义指令 为字体渲染颜色
<div id="app"> //v-color 是自定义的 <input type="text" class="form-cont ...
- R语言 循环语句、分支语句和中止语句-控制流篇
for 循环 用法 for (n in m) expr 若n在m中则运行 expr while 循环 用法 while (condition) expr 当符合condition时运行expr rep ...