前往
大廳
主題

LeetCode - 2397. Maximum Rows Covered by Columns 解題心得

Not In My Back Yard | 2023-07-26 12:00:12 | 巴幣 0 | 人氣 108

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的 m × n 二元矩陣 matrix 以及一個整數 numSelect,其代表著你必須從 matrix 中選出的相異行數。

讓我們考慮 s = {c1, c2, ...., cnumSelect} 作為你選擇的行之集合。一列 row 被 s 覆蓋,則代表:
對於每個格子 matrix[row][col](0 ≦ col ≦ n - 1,其中 matrix[row][col] == 1),col 存在於 s 中;或是
row 這一列中沒有格子的數值為 1。

你需要選擇出 numSelect 行,使得被覆蓋的列數最大化。

回傳你藉由選出 numSelect 行最多可以覆蓋多少列。

限制:
m == matrix.length
n == matrix[i].length
1 ≦ m, n ≦ 12
matrix[i][j] is either 0 or 1.
1 ≦ numSelect ≦ n



範例測資:
範例 1:
輸入: matrix = [[0,0,0],[1,0,1],[0,1,1],[0,0,1]], numSelect = 2
輸出: 3
解釋: 一個可能覆蓋 3 列的其中一個方式表示於上圖。
我們選擇 s = {0, 2}。
- 第 0 列被覆蓋了,因為它沒有 1 存在。
- 第 1 列被覆蓋了,因為該列中有 1 的行,即第 0 和第 2 行,都存在於 s 中。
- 第 2 列沒有被覆蓋,因為 matrix[2][1] == 1,但 1 不存在於 s 中。
- 第 3 列被覆蓋了,因為 matrix[2][2] == 1 且 2 存在於 s 中。
因此,我們覆蓋了三列。
注意到 s = {1, 2} 也覆蓋 3 列,但可以證明沒辦法覆蓋超過三列以上。

範例 2:
輸入: matrix = [[1],[0]], numSelect = 1
輸出: 2
解釋: 選擇任意行,將導致兩列都被覆蓋,因為實際上整個矩陣都被選走了。
因此,我們回傳 2。


解題思維:
直接窮舉所有可能的選擇即可,也就是窮舉 2 ^ n 種選擇行的方法,然後把那些剛好選 col 行的挑出來檢查各自覆蓋多少列。

檢查的過程可以簡化成位元運算,即把挑的行本身看成一個二進位數字(稱其為 X),而每一列自身也是看成一個二進位數字(這些數字以 Y 代稱)。

而要「覆蓋」一列,則代表著 X AND Y 將會等於 Y 本身,其中「AND」為位元運算「和」。

然後算出每一個可能性各自覆蓋的列數,取其中的最大值即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作