861. 翻转矩阵后的得分

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

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

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

返回尽可能高的分数。

1.我看了一遍解题分析写的:

public int matrixScore(int[][] A) {
		for(int i=0;i<A.length;i++) {//有多少行
			if(A[i][0]==0) {
				turnRow(A,i);
			}
		}//把所有行的第一个变成1
		int count0=0,count1=0;
		for(int j=1;j<A[0].length;j++) {
			for(int i=0;i<A.length;i++) {
				if(A[i][j]==0)count0++;
				else count1++;
			}
			if(count0>count1)turnCol(A,j);
            count0=0;
		    count1=0;
		}//完成所有列的比较
		int len=A[0].length;//多少列
		int sum1=0,sum2=0;
		for(int k=0;k<A.length;k++) {
			for(int j=0;j<A[0].length;j++) {
				sum1+=A[k][j]*Math.pow(2, len-j-1);//这一行的值
			}
			sum2+=sum1;
			sum1=0;
		}
		return sum2;
	}
	public static int[][] turnRow(int[][] A,int n){//翻转某行
		for(int j=0;j<A[n].length;j++) {
			if(A[n][j]==0)
				A[n][j]=1;
			else A[n][j]=0;
		}
		return A;
	}
	public static int[][] turnCol(int[][] A,int n){//翻转某列
		for(int j=0;j<A.length;j++) {
			if(A[j][n]==0)
				A[j][n]=1;
			else A[j][n]=0;
		}
		return A;
    }

步骤:
第一步:将首列全部置位1,保证最高位全部取到,首列不为1的行全部翻转
第二步:从第二列开始,将所有列中1的数量小于0的数量的列翻转,保证取1的数量尽可能多
第三步:计算结果返回

tips:
1.二进制转十进制是乘以Math.pow(2, len-j-1)
2.遍历已知数组,总行数为A.length,总列数为A[0].length

2.答案的方法

	public int matrixScore(int[][] A) {
		int m=A.length,n=A[0].length;
		int ret=m*(1<<(n-1));//第一列全部翻转为1后,第一列的总贡献
		//下面并不对矩阵进行实质上的翻转
		for(int j=1;j<n;j++) {
			int count1=0;
			for(int i=0;i<m;i++) {
				if(A[i][0]==1) {//这行没有进行翻转,则正常计算这列的1个数;
					count1+=A[i][j];
				}
				else {
					count1+=(1-A[i][j]);
				}
			}
			int k=Math.max(count1, m-count1);
			//直接选取这列较多的那个群体(0或1),因为反正若1少,就会翻转
			ret+=k*(1<<(n-j-1));
		}
		return ret;
    }

解释:
这个方法并不真实地改变矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值