給定由若干 0 和 1 組成的矩陣 matrix,從中選出任意數量的列并翻轉其上的 每個 單元格,翻轉后,單元格的值從 0 變成 1,或者從 1 變為 0 ,
回傳經過一些翻轉后,行上所有值都相等的最大行數,
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/flip-columns-for-maximum-number-of-equal-rows
我的思路:
這道題不太會,看了看人家的決議才恍然大悟!
如果兩個行是可以通過翻轉相同的列達到全行相同,那么就要滿足,兩行的相同的位置上的值異或之后等于全1 ,
那我們可以根據 異或 操作的特征:
a ^ b = c
那么
a ^ c = b
我們已知 c 是全1,那有沒有什么好的方法,用一個統一的規則,讓所有的行完成歸一?
我們已知,相同特征的行,每個位置都是不同的,那么我們能不能規定,第一位是 “0” 的就是 a,第一位是 “1”的就是b?
具體的規則就是,
1 如果第一位是 0 的話,那么就把全行都不用異或操作,直接轉為字串型別,作為key保存,且 value + 1,
2 如果第一位是 1 的話,那么就把全行的每個位置上的值都和 1 進行異或操作,然后轉為字串型別,作為key保存在下來,且 value+1,
最后,遍歷map,取最大的那個value,
class Solution { public: int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) { unordered_map<string, int> m; int res = 0; //對每一行,把行轉換為字串 for (auto& r : matrix) { string s; int d = 0 ^ r[0];//如果是第一位是1,與1異或變成1,相當于這一行需要取反; for (auto x : r) { s += (d ^ x)+48; } ++m[s];//統計每一種行的數量 res = max(res, m[s]); } return res; } };
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/175023.html
標籤:其他
下一篇:求助讀取hdfs時at org.apache.parquet.hadoop.InternalParquetRecordReader會產生大量的日志,怎么抑制
