矩陣0與1的差值 Leetcode 2484 Diff Between 1s and 0s in Row and Col

閱讀時間約 8 分鐘

題目敘述

題目會給定我們一個二元矩陣grid,要求我們計算這個矩陣的Difference值,並且以矩陣的形式返回答案。

對於grid[i][j] 的Difference值定義

= 同一個row i裡面 1的數目 + 同一個column j裡面 1的數目

- 同一個row i裡面 0的數目 + 同一個column j裡面 0的數目

(類似小時候玩電動,炸彈超人的十字線炸彈爆炸的走法)

下方測試範例有詳細的解說與計算過程


詳細的題目可在這裡看到


測試範例

Example 1:

raw-image
Input: grid = [[0,1,1],[1,0,1],[0,0,1]]
Output: [[0,0,4],[0,0,4],[-2,-2,2]]
Explanation:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 2 + 1 - 1 - 2 = 0
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 2 + 1 - 1 - 2 = 0
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 2 + 3 - 1 - 0 = 4
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 2 + 1 - 1 - 2 = 0
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 2 + 1 - 1 - 2 = 0
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 2 + 3 - 1 - 0 = 4
- diff[2][0] = onesRow2 + onesCol0 - zerosRow2 - zerosCol0 = 1 + 1 - 2 - 2 = -2
- diff[2][1] = onesRow2 + onesCol1 - zerosRow2 - zerosCol1 = 1 + 1 - 2 - 2 = -2
- diff[2][2] = onesRow2 + onesCol2 - zerosRow2 - zerosCol2 = 1 + 3 - 2 - 0 = 2

Example 2:

raw-image
Input: grid = [[1,1,1],[1,1,1]]
Output: [[5,5,5],[5,5,5]]
Explanation:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 3 + 2 - 0 - 0 = 5
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 3 + 2 - 0 - 0 = 5
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 3 + 2 - 0 - 0 = 5
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 3 + 2 - 0 - 0 = 5
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 3 + 2 - 0 - 0 = 5
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 3 + 2 - 0 - 0 = 5
 

約束條件

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10^5
  • 1 <= m * n <= 10^5
  • grid[i][j] is either 0 or 1.

演算法

除了第一直覺的暴力三次方搜索以外,還有一個更為精簡的二次方演算法。

題目已經講了輸入是二元矩陣。陣列元素要嘛是1要嘛是0


所以,當我們知道這條row的1的總數目,其實,相對應0的總數目也知道了。

當下這條row的0的總數目= 矩陣的寬 - 當下這條row的1的總數目


同理類推,當我們知道這條column的1的總數目,其實,相對應0的總數目也知道了。

當下這條column的0的總數目= 矩陣的高 - 當下這條column的1的總數目


因此,建立並且維護兩個字典,

第一個字典負責記錄每條row 1的總數目。

第二個字典負責記錄每條column 1的總數目。


用一個2D二維的線性掃描,更新字典,最後依照剛剛推導出的關係式根據題目定義計算Diff值即可。


程式碼

class Solution:
 def onesMinusZeros(self, grid: List[List[int]]) -> List[List[int]]:
  
  # key: row index
  # value: 1s count on corresponding row
  rowOnes = defaultdict(int)

  # key: column index
  # value: 1s count on corresponding column
  colOnes = defaultdict(int)

  # Height as well as Width of input matrix
  h, w = len(grid), len(grid[0])
  
  # Update 1s count with respect to specific column and row
  for y in range(h):
   for x in range(w):

    if grid[y][x] == 1:
     rowOnes[y] += 1
     colOnes[x] += 1


  # Just follow the definition in description
  # Diff = 1s Count - 0s Count  
  for y in range(h):
   for x in range(w):
    
    # In-place update
    grid[y][x] = rowOnes[y] + colOnes[x] - (w-rowOnes[y]) - (h-colOnes[x])

  return grid​

複雜度分析

時間複雜度:

O( mn ) 兩次二維掃描,成本皆為O(mn) = O(矩陣的寬 * 矩陣的高)。

空間複雜度:

O( m+n ) 使用到的是兩個字典,分別占用寬與高的大小。

第一個字典O(m) 紀錄每條row 1的總數目

第二個字典O(n) 紀錄每條column 1的總數目


關鍵知識點:

主要的考點在於HashMap 雜湊映射表,在python中就是dictionary字典的應用。


題目已經講了輸入是二元矩陣。陣列元素要嘛是1要嘛是0


所以,當我們知道這條row的1的總數目,其實,相對應0的總數目也知道了。

當下這條row的0的總數目= 矩陣的寬 - 當下這條row的1的總數目


同理類推,當我們知道這條column的1的總數目,其實,相對應0的總數目也知道了。

當下這條column的0的總數目= 矩陣的高 - 當下這條column的1的總數目


Reference:

[1] Python O(mn) by hashMap (dictionary) [w/ Comment] - Difference Between Ones and Zeros in Row and Column - LeetCode

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
題目敘述 題目會給我們一個字串,要求我們連三碼相同的數字,最大值是多少? 例如 給定輸入="1111222555333",最大值是555 如果無解,則返回空字串"" 英文版的題目敘述在這裡
題目敘述 題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。 要求我們列出所有過去30天的活躍使用者。 活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
題目敘述 題目會給我們一個字串,要求我們連三碼相同的數字,最大值是多少? 例如 給定輸入="1111222555333",最大值是555 如果無解,則返回空字串"" 英文版的題目敘述在這裡
題目敘述 題目會給我們一張Activity資料表,裡面分別有user_id、 session_id、activity_date 、activity_type等欄位。 要求我們列出所有過去30天的活躍使用者。 活躍使用者的定義為2019-07-27包含這天,往前三十天的區間內,至少有過一次活動紀錄
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
題目敘述 題目會給我們一張Cinema資料表,裡面分別有id、movie、description, rating 等欄位,其中id 是主鍵Primary Key。 要求我們列出所有推薦人ID為奇數,而且不無聊的電影,印出時依照電影rating評分從高到低降序排列。 Table: Cinema
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
在雙生靈魂之旅中,其中一個人承載著雙生靈魂的模板和靈性成長的意識,我們稱之為【靈性雙生Spiritual Twin】;而另一個人則過著世俗的生活,沒有進入靈性成長意識,我們稱之為【矩陣雙生Matrix Twin】。 ✨靈性雙生:我是修行者✨ 通常靈性雙生會先經歷個人的靈性覺醒,這或許可能發生在遇
Thumbnail
雙生靈魂原本就是一個靈性覺醒的劇本,兩人都承擔了特定的角色。 💗關於雙方角色扮演,你需要知道的事💗 當雙生靈魂決定要投身到三維的物理世界時,兩個靈魂會達成共識或理解他們應該做什麼來幫助彼此進步,而這些課題與設定的場景都會被記錄在你們的【雙生靈魂契約】。 在雙生靈魂之旅中,其中一個人承載著雙生靈魂
Thumbnail
〈舉手之勞的正義〉是2012年台灣推理作家協會第十屆徵文獎首獎作品,收錄在《死亡遊戲》,〈舉手之勞的正義v2.0〉則是響應2022年台灣推理作家協會二十周年紀念的續集,收錄在《故事的那時此刻》。兩篇相距十年,故事裡的時間也過了十年。
Thumbnail
秋季適合來金門玩,但選舉年的金門就沒那麼賞心悅目。和我2018年來的體驗一樣,今年同樣是鋪天蓋地的資訊轟炸,廣告看板布條旗子大大小小,綿延街道和觀光景點。因為大多數設計都沒什麼美感,且毫無章法四處亂貼亂綁亂插,市容可以說是不堪入目。
Thumbnail
矩陣式 LED 頭燈光源技術:矩陣頭燈的燈組由數個高亮度LED單體所組成,通過排列組合以及燈組前的透鏡和反光鏡等部件, 讓系統控制每個LED單體調整照明角度與範圍,不需要傳統的機械旋轉結構就能實現調節照明範圍的效果。工程師更易於掌控每個燈組內的LED數量,造型的自由度變得更大。
Thumbnail
蔡總統在2020大選中得票8,170,231票,而同日投票的不分區政黨票民進黨只得了4,811,241票(國民黨4,723,504票),相當於投蔡英文的選民中有3,358,990個選民(佔比41.11%)不將票投給民進黨,綠媒政論人士將之歸於[分裂投票]現象,也就是說全國選民自主性,精準的將總統票投
Thumbnail
    韓國瑜當選不當選其實不是懸念了,這麼說的意思,不是他一定會當選,而是人們都覺得他一定會當選。這是個很微妙的氛圍。 假如他萬一不當選的話,必然懷疑是奧步。南臺灣可能真的能暴動。韓的玩法,是讓粉
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
在雙生靈魂之旅中,其中一個人承載著雙生靈魂的模板和靈性成長的意識,我們稱之為【靈性雙生Spiritual Twin】;而另一個人則過著世俗的生活,沒有進入靈性成長意識,我們稱之為【矩陣雙生Matrix Twin】。 ✨靈性雙生:我是修行者✨ 通常靈性雙生會先經歷個人的靈性覺醒,這或許可能發生在遇
Thumbnail
雙生靈魂原本就是一個靈性覺醒的劇本,兩人都承擔了特定的角色。 💗關於雙方角色扮演,你需要知道的事💗 當雙生靈魂決定要投身到三維的物理世界時,兩個靈魂會達成共識或理解他們應該做什麼來幫助彼此進步,而這些課題與設定的場景都會被記錄在你們的【雙生靈魂契約】。 在雙生靈魂之旅中,其中一個人承載著雙生靈魂
Thumbnail
〈舉手之勞的正義〉是2012年台灣推理作家協會第十屆徵文獎首獎作品,收錄在《死亡遊戲》,〈舉手之勞的正義v2.0〉則是響應2022年台灣推理作家協會二十周年紀念的續集,收錄在《故事的那時此刻》。兩篇相距十年,故事裡的時間也過了十年。
Thumbnail
秋季適合來金門玩,但選舉年的金門就沒那麼賞心悅目。和我2018年來的體驗一樣,今年同樣是鋪天蓋地的資訊轟炸,廣告看板布條旗子大大小小,綿延街道和觀光景點。因為大多數設計都沒什麼美感,且毫無章法四處亂貼亂綁亂插,市容可以說是不堪入目。
Thumbnail
矩陣式 LED 頭燈光源技術:矩陣頭燈的燈組由數個高亮度LED單體所組成,通過排列組合以及燈組前的透鏡和反光鏡等部件, 讓系統控制每個LED單體調整照明角度與範圍,不需要傳統的機械旋轉結構就能實現調節照明範圍的效果。工程師更易於掌控每個燈組內的LED數量,造型的自由度變得更大。
Thumbnail
蔡總統在2020大選中得票8,170,231票,而同日投票的不分區政黨票民進黨只得了4,811,241票(國民黨4,723,504票),相當於投蔡英文的選民中有3,358,990個選民(佔比41.11%)不將票投給民進黨,綠媒政論人士將之歸於[分裂投票]現象,也就是說全國選民自主性,精準的將總統票投
Thumbnail
    韓國瑜當選不當選其實不是懸念了,這麼說的意思,不是他一定會當選,而是人們都覺得他一定會當選。這是個很微妙的氛圍。 假如他萬一不當選的話,必然懷疑是奧步。南臺灣可能真的能暴動。韓的玩法,是讓粉