最佳利益 調整後的分數的最大值 (二進位操作) Leetcode #861

更新於 發佈於 閱讀時間約 3 分鐘

題目敘述

輸入給定一個二元的二維矩陣grid

每次可以翻轉一條row,讓每個元素的01反相

也可以翻轉一條column,讓每個元素的01反相

可以操作任意多次

最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數

請問分數的最大值是多少


原本的英文題目敘述


測試範例

Example 1:

Input: grid = [[0,0,1,1],[1,0,1,0],[1,1,0,0]]
Output: 39
Explanation: 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39

Example 2:

Input: grid = [[0]]
Output: 1

約束條件

Constraints:

  • m == grid.length

m代表grid的高度

  • n == grid[i].length

n代表grid的寬度

  • 1 <= m, n <= 20

高度m和寬度n都介於 1 ~ 20之間。

  • grid[i][j] is either 0 or 1.

每個陣列元素都是0或1。


演算法 讓1盡可能多,並且居首位(MSB)

分數是row by row的二進位數字加總。

因此,為了分數最大化,推演出幾個想法。


一.

讓bit 1居首位(MSB)

因為1XXX ... X > 0XXX ... X

最高位是1永遠會比最高位是0的二進位數字還大,不論後面的分布情況為何


二.

MSB決定之後,接下來就是讓bit1 盡可能多,為了一致性

我們採取column wise的掃描方式,從第二高位掃描到最低位

每個column都採取讓1盡可能多的方式

如果保持原狀的bit1必較多,就保持原狀。

如果反轉的bit1比較多,就反轉。



程式碼 讓1盡可能多,並且居首位(MSB)

class Solution:
def matrixScore(self, grid: List[List[int]]) -> int:

h, w = len(grid), len(grid[0])

# Let MSB of each first column be 1
score = h

# Check from second column to last column
for column in range(1, w):

# Update score in binary representation
score <<= 1

# Option_1
keep = sum( grid[row][column] ^ grid[row][0] for row in range(h) )

# Option_2
flip = h - keep

# Add best score we can get on current column
score += max(keep, flip)

return score

複雜度分析

時間複雜度: O(h*w)

需要一個2D掃描,掃描每個元素恰好一次。


空間複雜度: O(1)

主要計算都是in-place計算,並且所用到的都是固定尺寸O(1)的臨時變數。


Reference:

[1] Score After Flipping Matrix - LeetCode

avatar-img
95會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言
avatar-img
留言分享你的想法!
給定一個方陣grid,請計算每個3x3窗口內的最大值,並且也以方陣的形式輸出答案。 原本的英文題目敘述 測試範例 Example 1: Input: grid = [[9,9,8,1],[5,6,2,6],[8,2,6,4],[6,2,2,2]] Output: [[9,9]
輸入給定一個已經從小到大排序好,而且彼此互質的整數陣列, 請問任取兩數分別當作分子、分母,第k小的分數是多少? 輸出請以 [分子,分母] 的形式回傳答案。
題目敘述 輸入給定一個整數陣列,分別代表每小朋友的快樂值。 要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值。 有一個特殊的規則,第一位選中的小朋友快樂值不變。 接著,第二位選中的小朋友快樂值-1 再接著,第三位選中的小朋友快樂值-2 快樂值扣到只剩下0就不再往下扣 .
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
給定一個方陣grid,請計算每個3x3窗口內的最大值,並且也以方陣的形式輸出答案。 原本的英文題目敘述 測試範例 Example 1: Input: grid = [[9,9,8,1],[5,6,2,6],[8,2,6,4],[6,2,2,2]] Output: [[9,9]
輸入給定一個已經從小到大排序好,而且彼此互質的整數陣列, 請問任取兩數分別當作分子、分母,第k小的分數是多少? 輸出請以 [分子,分母] 的形式回傳答案。
題目敘述 輸入給定一個整數陣列,分別代表每小朋友的快樂值。 要求我們選擇其中最快樂的k位小朋友,累加這群小朋友的快樂值。 有一個特殊的規則,第一位選中的小朋友快樂值不變。 接著,第二位選中的小朋友快樂值-1 再接著,第三位選中的小朋友快樂值-2 快樂值扣到只剩下0就不再往下扣 .
題目敘述 輸入給定一個整數陣列,分別代表每位運動員在比賽中的成績。 分數最高的給予金牌"Gold Medal" 分數次高的給予金牌"Silver Medal" 分數第三高的給予金牌"Bronze Medal" 剩餘的名次依照順序給予"4", "5", ..., "n" 的編號。 輸出時以字串
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 題目給定一個鏈結串列中的節點Node,要求我們從鏈結串列中刪除該節點。 題目保證該節點不是tail node。 題目要求我們in-place原位操作。 原本的英文題目敘述 測試範例 Example 1: Input: head = [4,5,1,9], node = 5
你可能也想看
Google News 追蹤
Thumbnail
該來的終究還是來了 度過焦躁不安的一整周,學徒老人家我的不安感等比級數的襲來,自3/19寫了第一篇關於<巴克萊銀行:倉促撤退>的報告,看到市場上的機構法人有如大洪水、地震來臨前夕開始竄逃撤退。 海湖莊園協議 接著,在3/31與4/2兩天接著寫了川普與他的財經團隊在海湖莊園豪
Thumbnail
空單爆天量、技術指標超賣、情緒恐慌到極致:美股嘎空行情有機會啟動嗎? 重點摘要: 技術面極度超賣,反彈條件醞釀中,但尚未明確止穩 SPY 與 QQQ 的重要指標,如MACD、KDJ、RSI等指標進入極端超賣區,但尚未出現底部鈍化或明確反轉訊號,技術面仍屬空方主導。 連續出現跳空缺口,空方動
Thumbnail
全新 vocus 挑戰活動「方格人氣王」來啦~四大挑戰任你選,留言 / 愛心 / 瀏覽數大 PK,還有新手專屬挑戰!無論你是 vocus 上活躍創作者或剛加入的新手,都有機會被更多人看見,獲得站上版位曝光&豐富獎勵!🏆
Thumbnail
該來的終究還是來了 度過焦躁不安的一整周,學徒老人家我的不安感等比級數的襲來,自3/19寫了第一篇關於<巴克萊銀行:倉促撤退>的報告,看到市場上的機構法人有如大洪水、地震來臨前夕開始竄逃撤退。 海湖莊園協議 接著,在3/31與4/2兩天接著寫了川普與他的財經團隊在海湖莊園豪
Thumbnail
空單爆天量、技術指標超賣、情緒恐慌到極致:美股嘎空行情有機會啟動嗎? 重點摘要: 技術面極度超賣,反彈條件醞釀中,但尚未明確止穩 SPY 與 QQQ 的重要指標,如MACD、KDJ、RSI等指標進入極端超賣區,但尚未出現底部鈍化或明確反轉訊號,技術面仍屬空方主導。 連續出現跳空缺口,空方動
Thumbnail
全新 vocus 挑戰活動「方格人氣王」來啦~四大挑戰任你選,留言 / 愛心 / 瀏覽數大 PK,還有新手專屬挑戰!無論你是 vocus 上活躍創作者或剛加入的新手,都有機會被更多人看見,獲得站上版位曝光&豐富獎勵!🏆