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