LeetCode每日一题,861. Score After Flipping Matrix
先看题目描述
算法和思路
贪心算法
算法分三步走
- 遍历每一行进行判断,判断该行是否需要翻转,若该行的第一个元素为 0, 则进行翻转,因为最优的情况下首列元素一定全为 1
- 遍历每一列进行判断,判断该列是否需要翻转,若该列中 0 的个数多于 1 的个数,则进行翻转,保证取 1 的数量尽可能多
- 计算结果并返回
算法源码
1 | class Solution { |
注意:由于移位运算的优先级低于加法运算,所以 temp = (temp << 1) + num 这的括号一定得加上,否则结果会出错
下面是官方题解的代码,整体思路其实是一致的,但具体到实现上和我写的代码差别挺大,官方题解的思路和代码如下所示
- 对于最左边的列而言,由于最优情况下,它们的取值都为 1,因此每个元素对分数的贡献都为 $2^{n-1}$,总贡献为 $m×2^{n-1}$
- 对于第 j 列(j > 0,此处规定最左边的列是第 0 列)而言,我们统计这一列 0,1 的数量,令其中的最大值为 k,则 k 是列翻转后的 1 的数量,该列的总贡献为 $k×2^{n-j-1}$,需要注意的是,在统计 0,1 的数量的时候,要考虑最初进行的行反转
1 | class Solution { |