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. 1 <= A.length <= 20
  2. 1 <= A[0].length <= 20
  3. A[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翻转矩阵后得分详细解法的更多相关文章

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

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

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

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

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

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

  4. [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 ...

  5. [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 ...

  6. [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 ...

  7. Java实现 LeetCode 519 随机翻转矩阵

    519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...

  8. C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  9. yzoi2226最小步数的详细解法

    Description - 问题描述 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字. ...

随机推荐

  1. 产品升级前后MD5码对比

    在做产品测试的时候,经常会需要对比升级前后的MD5码,这时可以通过终端登录设备,具体步骤如下: 1.在升级前时,将MD5码写入log1.info文件: check_md5 -d / -w log1.i ...

  2. 手写SpringBoot自动配置及自定义注解搭配Aop,实现升级版@Value()功能

    背景 项目中为了统一管理项目的配置,比如接口地址,操作类别等信息,需要一个统一的配置管理中心,类似nacos. 我根据项目的需求写了一套分布式配置中心,测试无误后,改为单体应用并耦合到项目中.项目中使 ...

  3. Java应用服务器之tomcat会话复制集群配置

    会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来:常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或 ...

  4. python-闭包和装饰器-02-装饰器(decorator)

    装饰器(decorator) 理解了上一章的闭包之后,装饰器就是闭包的一种应用,只是外部函数的参数传入的不是普通的变量类型,而是传入一个函数名.装饰器一般用于:不修改被装饰函数(即外部函数传入的参数) ...

  5. .NET Core 微服务—API网关(Ocelot) 教程 [二]

    上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...

  6. R常用统计 - 相关关系分析

    数据格式 每行分别为表型和基因表达情况对应标量,每列分别为样品名的矩阵.假定前9列为phenotype,从第10行起为gene_id,编写简单for循环如下: script require(" ...

  7. 你不知道的Java引用

    什么是引用   引用就是保存着一块地址(门牌号)的对象,就像C语言的指针那样,引用可以传递某个数据的地址,如果我们想拿到某一条数据,就要先找到他的地址,然后告诉计算机我去拿这个地址的数据,最后计算机就 ...

  8. defineProperty 和Proxy双向绑定演示,你还不知道么?

    双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行. 在这个例子中,我们使用defineProperty ,Object.define ...

  9. SpringBoot环境下使用测试类注入Mapper接口报错解决

    当我们在进行开发中难免会要用到测试类,而且测试类要注入Mapper接口,如果测试运行的时候包空指针异常,看看测试类上面的注解是否用对! 正常测试我们需要用到的注解有这些: @SpringBootTes ...

  10. 设置x 轴斜体(每次我都百度,这次单独为它发一个)

    plt.xticks(rotation = 45) 2020-06-07