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

更新於 2024/12/13閱讀時間約 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

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們兩張資料表,第一張是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
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
通常我們會說覺得“時間停止了"。它確實停止了。 當你也停止的時候,你往往會經驗到生活中最美好的時刻。 時間的相對性。它指出,當我們停下來專注於當下時,會感覺時間好像停止了。這是因為時間是一種相對的概念,取決於我們對周圍事物的感知。愛因斯坦等人認識到時間是一種精神構造,而非絕對存在的客觀事物。
Thumbnail
用你的思想掙脫束縛 作為一個人類,要突破矩陣可能是一個極具挑戰性且充滿想像力的議題。首先,我們需要確定矩陣的具體定義,以及其存在的形式和範圍。矩陣可能是指一個虛擬的世界或者一個對人類社會的控制系統,因此我們需要深入了解其運作原理和結構。 要突破矩陣,我們需要具備豐富的知識和技能。這包括對科學、
Thumbnail
稿紙上 井田俯首耕種 情苗秧詩 將妳愛語~排成矩陣 共我愛戀~佈成迷宮 永不出離
在現今多變且競爭激烈的商業環境中,企業組織結構的選擇與管理是一個重要的問題。如何能夠充分利用資源,同時又靈活地應對市場變化?矩陣式組織結構是關鍵,強化內部員工與領導聯繫,保持部門專業的同時,還能進一步靈活調動員工工作資源。
Thumbnail
題目敘述 題目會給定我們一個二元矩陣grid,要求我們計算這個矩陣的Difference值,並且以矩陣的形式返回答案。 對於grid[i][j] 的Difference值定義 = 同一個row i裡面 1的數目 + 同一個column j裡面 1的數目 - 同一個row i裡面 0的數目
Thumbnail
在雙生靈魂之旅中,其中一個人承載著雙生靈魂的模板和靈性成長的意識,我們稱之為【靈性雙生Spiritual Twin】;而另一個人則過著世俗的生活,沒有進入靈性成長意識,我們稱之為【矩陣雙生Matrix Twin】。 ✨靈性雙生:我是修行者✨ 通常靈性雙生會先經歷個人的靈性覺醒,這或許可能發生在遇
Thumbnail
雙生靈魂原本就是一個靈性覺醒的劇本,兩人都承擔了特定的角色。 💗關於雙方角色扮演,你需要知道的事💗 當雙生靈魂決定要投身到三維的物理世界時,兩個靈魂會達成共識或理解他們應該做什麼來幫助彼此進步,而這些課題與設定的場景都會被記錄在你們的【雙生靈魂契約】。 在雙生靈魂之旅中,其中一個人承載著雙生靈魂
Thumbnail
〈舉手之勞的正義〉是2012年台灣推理作家協會第十屆徵文獎首獎作品,收錄在《死亡遊戲》,〈舉手之勞的正義v2.0〉則是響應2022年台灣推理作家協會二十周年紀念的續集,收錄在《故事的那時此刻》。兩篇相距十年,故事裡的時間也過了十年。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
通常我們會說覺得“時間停止了"。它確實停止了。 當你也停止的時候,你往往會經驗到生活中最美好的時刻。 時間的相對性。它指出,當我們停下來專注於當下時,會感覺時間好像停止了。這是因為時間是一種相對的概念,取決於我們對周圍事物的感知。愛因斯坦等人認識到時間是一種精神構造,而非絕對存在的客觀事物。
Thumbnail
用你的思想掙脫束縛 作為一個人類,要突破矩陣可能是一個極具挑戰性且充滿想像力的議題。首先,我們需要確定矩陣的具體定義,以及其存在的形式和範圍。矩陣可能是指一個虛擬的世界或者一個對人類社會的控制系統,因此我們需要深入了解其運作原理和結構。 要突破矩陣,我們需要具備豐富的知識和技能。這包括對科學、
Thumbnail
稿紙上 井田俯首耕種 情苗秧詩 將妳愛語~排成矩陣 共我愛戀~佈成迷宮 永不出離
在現今多變且競爭激烈的商業環境中,企業組織結構的選擇與管理是一個重要的問題。如何能夠充分利用資源,同時又靈活地應對市場變化?矩陣式組織結構是關鍵,強化內部員工與領導聯繫,保持部門專業的同時,還能進一步靈活調動員工工作資源。
Thumbnail
題目敘述 題目會給定我們一個二元矩陣grid,要求我們計算這個矩陣的Difference值,並且以矩陣的形式返回答案。 對於grid[i][j] 的Difference值定義 = 同一個row i裡面 1的數目 + 同一個column j裡面 1的數目 - 同一個row i裡面 0的數目
Thumbnail
在雙生靈魂之旅中,其中一個人承載著雙生靈魂的模板和靈性成長的意識,我們稱之為【靈性雙生Spiritual Twin】;而另一個人則過著世俗的生活,沒有進入靈性成長意識,我們稱之為【矩陣雙生Matrix Twin】。 ✨靈性雙生:我是修行者✨ 通常靈性雙生會先經歷個人的靈性覺醒,這或許可能發生在遇
Thumbnail
雙生靈魂原本就是一個靈性覺醒的劇本,兩人都承擔了特定的角色。 💗關於雙方角色扮演,你需要知道的事💗 當雙生靈魂決定要投身到三維的物理世界時,兩個靈魂會達成共識或理解他們應該做什麼來幫助彼此進步,而這些課題與設定的場景都會被記錄在你們的【雙生靈魂契約】。 在雙生靈魂之旅中,其中一個人承載著雙生靈魂
Thumbnail
〈舉手之勞的正義〉是2012年台灣推理作家協會第十屆徵文獎首獎作品,收錄在《死亡遊戲》,〈舉手之勞的正義v2.0〉則是響應2022年台灣推理作家協會二十周年紀念的續集,收錄在《故事的那時此刻》。兩篇相距十年,故事裡的時間也過了十年。