[算法练习及思路-leetcode每日一题(Java解法)]No861.翻转矩阵后的得分

该博客介绍了一种解决二维矩阵翻转以获取最高得分问题的算法。首先确保第一列全为1,然后逐列翻转,当某列1的数量少于0时进行翻转。最终通过计算每行二进制表示的和得到最高分数。提供的Java代码实现了这一策略,并给出了一个示例输入及输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题号:no861

题目名:翻转矩阵后的得分
原题URL:https://leetcode-cn.com/problems/score-after-flipping-matrix/
题目描述

有一个二维矩阵 A 其中每个元素的值为 0 或 1 。

移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。

在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。

返回尽可能高的分数。

示例

示例 1:

输入:[[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 <= 20
  • 1 <= A[0].length <= 20
  • A[i][j]01
思路

1.想要得到的数的总和大,就好像两个数比较,如果第一位大,那么这个数肯定就大,所以一定要保证第一位都是1,之后再考虑别的位置

2.根据这个思路,先将第一列所有不为1的位置按照行翻转为1,这样第一列其他也不会受到影响

3.然后从第二列开始翻转,翻转的同时不影响第一行,所以只能列翻转,翻转要求就是当前列0小于1个数的时候,这样这一列的1就会尽量多

4.翻转后在进行计算

解题代码
public class Solution {
    public int matrixScore(int[][] A) {
        //先将第一列的数据所有0变成1
        for (int i = 0; i < A.length; i++) {
            //翻转行
            if(A[i][0]==0) {
                for (int j = 0; j < A[i].length; j++) {
                    A[i][j] =  A[i][j]== 0?1:0;
                }
            }
        }
        //将第二列以后所有列只要1的数量小于0的都进行饭庄
        for (int i = 1; i < A[0].length; i++) {
            int count0 = 0;
            int count1 = 0;
            for (int j = 0; j < A.length; j++) {
                if(A[j][i]==0) count0++;
                else count1++;
            }
            if(count0>count1) {
                for (int j = 0; j < A.length; j++) {
                    A[j][i] =  A[j][i]== 0?1:0;
                }
            }
        }
        int sum = 0;
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < A[i].length; j++) {
                if(A[i][j]==1) sum+=Math.pow(2,A[i].length-1-j);
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        int[][] arr = {

                {0,0,1,1},{1,0,1,0},{1,1,0,0}
        };
        int j = s.matrixScore(arr);
        System.out.println(j);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值