翻转矩阵后的得分

  • Post author:
  • Post category:其他


有一个二维矩阵 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 <= A.length <= 20

1 <= A[0].length <= 20

A[i][j] 是 0 或 1


思路:


1000>0111,所以先把所有第一列不是1的行进行行反转。然后再判断各列是否需要翻转。反转的策略是这一列0的数是否大于列数的一半,若大于一半,就要翻转。

public int matrixScore(int[][] A) {
		 int l1 = A.length;
		 int l2 = A[0].length;
		 
		 //先根据第一列是否为0进行横向翻转
		 for(int i=0;i<l1;i++) {
			 if(A[i][0]==0) {
				 for(int j=0;j<l2;j++)
					 A[i][j] = A[i][j]==0?1:0;
			 }
		 }
		 
		 //列反转
		 for(int j=1;j<l2;j++) {
			 if(check(A,j)) {
				 for(int i=0;i<l1;i++)
					 A[i][j]=A[i][j]==0?1:0;
			 }
		 }
		 
		 int sum = 0;
		 for(int i=0;i<l1;i++)
			 for(int j=0;j<l2;j++) {
				 sum += A[i][j]* Math.pow(2, l2-j-1);
			 }
		 return sum;
	 }
	 
	 //判断纵向是否需要翻转
	 public  boolean check(int[][] A,int j) {
		 int just = A.length/2;
		 int l1 = A.length;
		 int n = 0;

		 for(int i=0;i<l1;i++) {
			if(A[i][j]==0)
				 n++;
			if(n>just)
				return true;
		 }
		 return false;
	 }



版权声明:本文为qq_40686377原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。