計數應用題 等比例矩形配對的數目 Leetcode #2001

閱讀時間約 5 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給定一組輸入陣列,裡面每個參數分別代表矩形的寬和高。
如果有兩個矩形的寬/高的比例是相同的,代表這兩個矩形是等比例的。

要求我們計算,等比例的矩形pair總共有多少個?


測試範例

Example 1:

Input: rectangles = [[4,8],[3,6],[10,20],[15,30]]
Output: 6
Explanation: The following are the interchangeable pairs of rectangles by index (0-indexed):
- Rectangle 0 with rectangle 1: 4/8 == 3/6.
- Rectangle 0 with rectangle 2: 4/8 == 10/20.
- Rectangle 0 with rectangle 3: 4/8 == 15/30.
- Rectangle 1 with rectangle 2: 3/6 == 10/20.
- Rectangle 1 with rectangle 3: 3/6 == 15/30.
- Rectangle 2 with rectangle 3: 10/20 == 15/30.

Example 2:

Input: rectangles = [[4,5],[7,8]]
Output: 0
Explanation: There are no interchangeable pairs of rectangles.

 


約束條件

Constraints:

  • n == rectangles.length
  • 1 <= n <= 105
  • rectangles[i].length == 2
  • 1 <= widthi, heighti <= 105

演算法

除了第一直覺,雙層迴圈直接去模擬good pair的生成並且計數以外;這題還有一個高效率的排列組合作法。

基本上和前一題 good pair counting 那題九成像,換湯不換藥。都是任選兩個物品,可以構成一組pair。

唯一的小差別是:

前一題是 數字相同的兩個數字,構成一組good pair。

這一題是 寬/高 比例相同的兩個矩形,構成一組rectangle pair。

最後,還額外多提供一種等價的one-pass counting演算法,供讀者比較、參考。


程式碼 C(n, 2) 法

class Solution:
 def interchangeableRectangles(self, rectangles: List[List[int]]) -> int:
  
  rect_ratio = defaultdict(int)

  # update occurrence of w/h ratio
  for width, height in rectangles:
   cur_ratio = width / height
   rect_ratio[ cur_ratio ] += 1

  # count the interchangeable rectangles by definition and C(n, 2) formula
  counter = 0
  for ratio, n in rect_ratio.items():
   
   counter += n * ( n-1 ) // 2

  return counter

程式碼 one-pass的邊數邊算法

class Solution:
 def interchangeableRectangles(self, rectangles: List[List[int]]) -> int:
  
  rect_ratio = defaultdict(int)

  counter = 0
  for width, height in rectangles:

   cur_ratio = width / height

   # update occurrence of w/h ratio
   counter += rect_ratio[ cur_ratio ]

   # count the interchangeable rectangles by definition
   rect_ratio[ cur_ratio ] += 1

  return counter



複雜度分析

時間複雜度:

O( n ) 建造字典掃描數字耗費O(n),掃描字典內的數字也耗費O(n)。

空間複雜度:

O( n ) 字典大小最大和陣列一樣長,所佔用空間為O(n)。


關鍵知識點

觀察並且模擬幾個小範例,可以這種pair counting類的題目,背後的原理其實就是n個物品,任選兩個的方法數,可以由排列組合公式C(n, 2)計算得到答案。

強烈建議複習前面 good pair counting這題,其實原理都是相通的喔!


Reference:

[1] Python O(n) by ratio counting [w/ Comment] - Number of Pairs of Interchangeable Rectangles - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
[Python] 語音技術與應用:語音轉文字在這篇文章中,我們將講解一些常見的語音技術以及如何在Python中使用這些技術。 安裝套件 匯入套件 語音辨識:
avatar
Pochi
2023-04-29
ChatGPT:革命性的自然語言處理技術及其應用 Write with chatgpt探索 ChatGPT,這是一項尖端技術,利用自然語言處理提供複雜的回應並不斷學習和改進。了解 ChatGPT 的歷史、應用和對社會可能帶來的影響。ChatGPT 在醫療、金融、教育和娛樂等領域有廣泛的應用。探索這項技術在各個領域中的幫助方式。ChatGPT 有可能改變我們與技術和工具互動的方式。了解
Thumbnail
avatar
j172tw Blogz
2023-04-29
虛擬貨幣與區塊鏈技術的應用前景:現實經濟的革命虛擬貨幣(Cryptocurrency)在近年來的價格暴漲暴跌引起了許多人的關注。不過,虛擬貨幣與經濟之間的關係並不簡單。 首先,虛擬貨幣本身並不是經濟的基礎。經濟的基礎是現實世界中的資產和貨幣,例如土地、房屋、股票、債券、法幣等。虛擬貨幣在經濟中扮演的角色是一種交換媒介和價值儲存工具,類似於現實世
Thumbnail
avatar
Theo-K
2023-04-04
EXCEL函數應用/存股紀錄表/訂閱者索取【回饋訂閱者索取:存股紀錄表(含存股總覽)】 簡述 這份存股紀錄表是2022年中完成製作的,目前已經分別在蝦皮、FB粉專兩處公開販售。建立起存股紀錄的習慣,就如同理財記帳一樣,都可以對存股之路有不小的幫助,聰聰自從做完存股紀錄表後,也是使用到現在,持續記錄著不定期不定額的存股加碼履歷。(題外話:有需
Thumbnail
avatar
存股攻城獅-聰聰
2022-12-13
技術分析應用,實戰交易逐步解析,學會之後,你也會有能力從「上帝視角」看盤!技術分析,是邏輯推理的藝術,而不是看圖說故事的線仙!!! 老話一句,交易做不好並不是看不懂,純粹是你故意的!有心想學習的就追蹤、訂閱血哥,追不追蹤、訂不訂閱,也都是你故意的!
Thumbnail
avatar
血哥-交易員培訓計劃
2022-09-07
avatar
方小小
2022-07-18
物聯網應用技術與發展,智慧城市在不遠之處萬物聯網 — — 物聯網及物聯網應用的常見場域 物聯網即所謂的「萬物聯網」,包含一切可以連上網際網路並可以達到遠端控制的物品,比如智慧型手機、智慧家電等。如今,物聯網的概念更是奠基於全球化的網路服務之上,以網路連結實體物品與虛擬數據,實現的各式應用服務,舉凡控制(如智慧語音助理:Siri、Alexa
Thumbnail
avatar
緯寶說說
2021-11-11
替位式主觀賞析的技術應用與想像此篇所定義的「替位式主觀視覺」(substitutional subjective-vision): 就是種可以由遠端透過數位鏡頭去實踐的數位替身應用,且使這種替位式數位視覺可以在各個鏡頭設置點間自由地切換。
Thumbnail
avatar
ATI-1-2-09 施登騰
2021-01-11
8個VR技術應用在醫藥產業的好處!虛擬實境(Virtual reality) 存在已經有一段時間了,其在遊戲產業的蓬勃發展大眾有目共睹。儘管在醫藥產業VR的發展慢了些,但他或許有能力對整個產業造成極大的影響改變。以下整理出了八項VR對醫藥產業所能產生的好處!
Thumbnail
avatar
Jay Kuo
2020-02-12