美文网首页
[leetcode]Score After Flipping M

[leetcode]Score After Flipping M

作者: 律动的时间线 | 来源:发表于2019-01-23 19:32 被阅读0次

    题目要求:
    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

    这里的核心是怎么切换保证能得到最大的值?
    我本来想着利用计数排序的思路,先令最后的列满足最大全为1,然后是倒数第二列,但有个问题就是,如果原本此列都是1的话,就要出现错误,因为要排除此错误还要家条件判断,程序会很复杂,明显不是正确解。
    因此看了解决方案,是利用贪婪算法的路子。
    利用行切换,保证0列全为1,然后后面全部使用列切换,对后面每列,0多就切换,保证数值局部最大,如果1多直接加。
    其中还有一个点就是对于构建类似二进制转为十进制方法,因为在java,执行二进制操作会自动转为十进制显示,所以就利用位移操作来实现二进制指定位的填充。

    class Solution {
        public int matrixScore(int[][] A) {
            int n = A.length;
            int m = A[0].length;
            int res=n*(1<<m-1);
    //得到最高位填充指定位置得到的二进制数字
            for(int j=1;j<m;j++){
                int cur=0;
                for(int i=0;i<n;i++) cur+=A[i][j]==A[i][0]?1:0;
                res+=Math.max(cur,n-cur)*(1<<m-1-j);
    //同样利用位移实现指定二进制位的填充
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:[leetcode]Score After Flipping M

          本文链接:https://www.haomeiwen.com/subject/hqpsjqtx.html