矩陣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

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
題目敘述 題目會給定我們一個二維陣列,要求我們計算內部元素相同的column row pairs總共有多少條? 註: pair的定義就是row i 和 column j 彼此內部元素值都相同,這樣就算一條pair。 題目的原文敘述 測試範例 Example 1: Input: gr
Thumbnail
題目敘述 題目會給定我們一個二維陣列,要求我們計算內部元素相同的column row pairs總共有多少條? 註: pair的定義就是row i 和 column j 彼此內部元素值都相同,這樣就算一條pair。 題目的原文敘述 測試範例 Example 1: Input: gr
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們一個二元矩陣grid,要求我們計算這個矩陣的Difference值,並且以矩陣的形式返回答案。 對於grid[i][j] 的Difference值定義 = 同一個row i裡面 1的數目 + 同一個column j裡面 1的數目 - 同一個row i裡面 0的數目
Thumbnail
題目敘述 題目會給定我們一個二元矩陣grid,要求我們計算這個矩陣的Difference值,並且以矩陣的形式返回答案。 對於grid[i][j] 的Difference值定義 = 同一個row i裡面 1的數目 + 同一個column j裡面 1的數目 - 同一個row i裡面 0的數目
Thumbnail
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
Thumbnail
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
Thumbnail
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
Thumbnail
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
Thumbnail
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
Thumbnail
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
Thumbnail
題目:給定一個由 1 和 0 組成的數組,將等效的二進位值轉換為整數。 例如:[0, 0, 0, 1] 被視為 0001,即 1 的二進位表示法。
Thumbnail
題目:給定一個由 1 和 0 組成的數組,將等效的二進位值轉換為整數。 例如:[0, 0, 0, 1] 被視為 0001,即 1 的二進位表示法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News