将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分
生活随笔
收集整理的這篇文章主要介紹了
将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點擊上方藍字設為星標
下面開始今天的學習~力扣 ?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
方法:貪心
根據題意,能夠知道一個重要的事實:給定一個翻轉方案,則它們之間任意交換順序后,得到的結果保持不變。因此,我們總可以先考慮所有的行翻轉,再考慮所有的列翻轉。不難發現一點:為了得到最高的分數,矩陣的每一行的最左邊的數都必須為 1。為了做到這一點,我們可以翻轉那些最左邊的數不為 1 的那些行,而其他的行則保持不動。當將每一行的最左邊的數都變為 1 之后,就只能進行列翻轉了。為了使得總得分最大,我們要讓每個列中 1 的數目盡可能多。因此,我們掃描除了最左邊的列以外的每一列,如果該列 0?的數目多于 1 的數目,就翻轉該列,其他的列則保持不變。實際編寫代碼時,我們無需修改原矩陣,而是可以計算每一列對總分數的「貢獻」,從而直接計算出最高的分數。假設矩陣共有 m 行 n 列,計算方法如下:對于最左邊的列而言,由于最優情況下,它們的取值都為 1,因此每個元素對分數的貢獻都為 2^(n - 1)?,總貢獻為 m * 2^(n - 1)。
對于第 j 列(j > 0,此處規定最左邊的列是第 0 列)而言,我們統計這一列 0,1 的數量,令其中的最大值為 k,則 k 是列翻轉后的 1 的數量,該列的總貢獻為 k*2^(n - j - 1)。需要注意的是,在統計 0,1 的數量的時候,要考慮最初進行的行反轉。
時間復雜度:O(mn),其中 m 為矩陣行數,n 為矩陣列數。
空間負責度:O(1)。
BY /?
本文作者:力扣
編輯&版式:霍霍
聲明:本文歸“力扣”版權所有,如需轉載請聯系。
點個在看,少個?bug?
總結
以上是生活随笔為你收集整理的将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究称AI对教学岗影响最大,老师要学会如
- 下一篇: 删除了几个月的照片能找回么_手机删除的照