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. 翻转矩阵后的得分的主要内容,如果未能解决你的问题,请参考以下文章