861. 翻转矩阵后的得分

Posted lancelee98

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了861. 翻转矩阵后的得分相关的知识,希望对你有一定的参考价值。

有一个二维矩阵 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/score-after-flipping-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 class Solution {
 4 public:
 5     //贪心思想 
 6     //若每行的第一个数都是1 才会得分最高
 7     //所以先贪心每行的第一位数 都让它为1
 8     //此时就不能改变行了 因为改变行会导致第一位不为1
 9     //接着从第二列开始贪心列 使得每一列的1的个数最多
10     void inverseRow(vector<vector<int>>& A, int row)//翻转行
11     {
12         int col_size = A[0].size();
13         for (int j = 0; j < col_size; j++)
14             A[row][j] = A[row][j] ^ 1;
15     }
16     void inverseCol(vector<vector<int>>& A, int col)//翻转列
17     {
18         int row_size = A.size();
19         for (int i = 0; i < row_size; i++)
20             A[i][col] = A[i][col] ^ 1;
21     }
22     int computeRes(vector<vector<int>>& A)//计算结果
23     {
24         int res = 0;
25         int row = A.size(), col = A[0].size();
26         int temp = 0;
27         for (int i = 0; i < row; i++)//计算每一行
28         {
29             temp = 0;//每一行的二进制值
30             for (int j = 0; j < col; j++)
31                 temp = temp * 2 + A[i][j];
32             res += temp;
33         }
34         return res;
35     }
36     int matrixScore(vector<vector<int>>& A) {
37         int row = A.size(), col = A[0].size();
38         for (int i = 0; i < row; i++)if (!A[i][0])inverseRow(A, i);//对第一列进行贪心 翻转每行 使得第一列为全1
39         int count_1;
40         for (int j = 1; j < col; j++)//对之后的每一列进行贪心 翻转列
41         {
42             count_1 = 0;//记录当前列为1的个数
43             for (int i = 0; i < row; i++)if (A[i][j])count_1++;
44             if (count_1 <= row / 2)inverseCol(A, j);//若为1的个数小于行数的一半 则需要列翻转
45         }
46         return computeRes(A);
47     }
48 };
49 int main()
50 {
51     int m, n, temp, data;
52     cin >> m >> n;
53     vector<vector<int>> A;
54     while (m--)
55     {
56         temp = n;
57         vector<int> v;
58         while (temp--)
59         {
60             cin >> data;
61             v.push_back(data);
62         }
63         A.push_back(v);
64     }
65     cout << Solution().matrixScore(A);
66     return 0;
67 }

 

以上是关于861. 翻转矩阵后的得分的主要内容,如果未能解决你的问题,请参考以下文章

861. 翻转矩阵后的得分

LeetCode 861. 翻转矩阵后的得分

LeetCode 中级 - 翻转矩阵后的得分(861)

leetcode中等861翻转矩阵后的得分

leetcode中等861翻转矩阵后的得分

力扣——翻转矩阵后的得分