🗿字典應用: Most Stones Removed with Same Row or Column_LC#947

更新於 2024/08/29閱讀時間約 1 分鐘

題目敘述 Most Stones Removed with Same Row or Column


給定一個2D平面,好幾顆石頭散布在不同的點座標。

輸入陣列代表每顆石頭所在的(x, y)座標

如果某顆石頭的x座標或者y座標相同的軸線上,還有其他石頭,
則原本那顆石頭可以移除。

請問最多可以移除幾顆石頭?


測試範例

Example 1:

Input: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
Output: 5
Explanation: One way to remove 5 stones is as follows:
1. Remove stone [2,2] because it shares the same row as [2,1].
2. Remove stone [2,1] because it shares the same column as [0,1].
3. Remove stone [1,2] because it shares the same row as [1,0].
4. Remove stone [1,0] because it shares the same column as [0,0].
5. Remove stone [0,1] because it shares the same row as [0,0].
Stone [0,0] cannot be removed since it does not share a row/column with another stone still on the plane.

Example 2:

Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output: 3
Explanation: One way to make 3 moves is as follows:
1. Remove stone [2,2] because it shares the same row as [2,0].
2. Remove stone [2,0] because it shares the same column as [0,0].
3. Remove stone [0,2] because it shares the same row as [0,0].
Stones [0,0] and [1,1] cannot be removed since they do not share a row/column with another stone still on the plane.

Example 3:

Input: stones = [[0,0]]
Output: 0
Explanation: [0,0] is the only stone on the plane, so you cannot remove it.

約束條件

Constraints:

  • 1 <= stones.length <= 1000

石頭總數介於1顆~1000顆。

  • 0 <= xi, yi <= 10^4

x, y 座標介於 0 ~ 一萬

  • No two stones are at the same coordinate point.

所有石頭的位置都相異。


觀察:

題目說x座標相同 或者 y座標相同的時候,可以拿走一顆石頭。

那麼,我們可以把x座標相同 或者 y座標相同的石頭都歸類成同一組。

如果這組有k個石頭,那麼可以陸續拿走k-1顆石頭,直到剩下最後一顆為止。


每組都可以依循相同的操作邏輯去拿石頭。

最後,可以推得,最多可拿石頭總數 = 石頭總數 - 分組的數目

示意圖

以範例二為例:

Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output: 3
raw-image

演算法 Disjoint Set 石頭分組


正數都拿來記錄石頭的x座標。

負數都拿來記錄石頭的y座標。

如果兩顆石頭的x座標 或 y座標相等,就歸入同一組。


歸入同一組的操作就對應到Disjoint Set的union()

查詢屬於那一組的操作就對應到Disjoint Set的find()


最後計算石頭總數 - 分組數,即可得到 可移除石頭的最大數量


程式碼 Disjoint Set 石頭分組

class Solution:
def removeStones(self, points):

# Didjoint Set, aka Union-Find
root = {}

def find(x):
if x != root[x]:
root[x] = find(root[x])
return root[x]

def union(x, y):
root.setdefault(x, x)
root.setdefault(y, y)
root[find(x)] = find(y)

for x, y in points:
union(x, -y-1)

return len(points) - len({find(x) for x in root})

複雜度分析

時間複雜度: O(n)

掃描每顆石頭,每顆石頭依據座標分組。

空間複雜度: O(n)

最差情況下,每顆石頭的x座標 y座標都相異,這時候UF所需空間為O(n)


Reference

[1] Most Stones Removed with Same Row or Column

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
給定兩個相同大小的二維陣列grid1, grid2。 格子點為0的地方代表海洋,格子點為1的地方代表陸地。 島嶼的定義是4連通(上、下、左、右)相鄰在一起的陸地。 如果有某個區域在grid2 是島嶼而且在grid1也是陸地, 那麼這些區域就稱為「子島嶼」。 請問grid2裡有多少座子島嶼?
題目敘述 N-ary Tree Postorder Traversal 題目給定一個n-ary(每個節點最多n個子樹)的樹根。 請返回後序拜訪這棵樹的軌跡。 推廣後的後序拜訪的定義: 1.從左到右依序拜訪所有子樹。 2.拜訪目前的節點。
題目敘述 145. Binary Tree Postorder Traversal 題目給定一個二元樹的根結點。 請輸出後序拜訪(Post-order traversal)的拜訪序列。 後序拜訪的定義: 1.拜訪左子樹。 2.拜訪右子樹。 3.拜訪目前的節點。
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
給定兩個相同大小的二維陣列grid1, grid2。 格子點為0的地方代表海洋,格子點為1的地方代表陸地。 島嶼的定義是4連通(上、下、左、右)相鄰在一起的陸地。 如果有某個區域在grid2 是島嶼而且在grid1也是陸地, 那麼這些區域就稱為「子島嶼」。 請問grid2裡有多少座子島嶼?
題目敘述 N-ary Tree Postorder Traversal 題目給定一個n-ary(每個節點最多n個子樹)的樹根。 請返回後序拜訪這棵樹的軌跡。 推廣後的後序拜訪的定義: 1.從左到右依序拜訪所有子樹。 2.拜訪目前的節點。
題目敘述 145. Binary Tree Postorder Traversal 題目給定一個二元樹的根結點。 請輸出後序拜訪(Post-order traversal)的拜訪序列。 後序拜訪的定義: 1.拜訪左子樹。 2.拜訪右子樹。 3.拜訪目前的節點。
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
想要讓自己學外語更輕鬆,或快速了解外文的意思,千萬別錯過這份我個人私藏的清單,強烈推薦給你!對了,就算你還不是方格子會員,現在也可以不註冊會員直接手刀入手喔!
Thumbnail
【吳守禮與他的卡片盒筆記法】 吳守禮是日治時期第一代在臺灣本土培育的高教菁英,也是戰後臺灣大學文學院少數的本省籍師資。他的專長是臺灣閩南方言的研究,並於晚年投入臺語字典的編纂工作。
Thumbnail
這是本有意思的書,主題頗不尋常,講的是編字典的人。 對現代人來,字典是稀鬆平常的東西,尤其網路很方便,所謂字典,不過是游標固定在字上面就會自動跳出來的東西,遇到不認識的字,手機拍一下也能辨識,一切都那麼自然。 但其實一點也不自然,畢竟文字本身就是理性運作之下產出的東西,來源則是同樣由理性運作構成的語
Thumbnail
才發現埋怨總是用在親近的人身上,在看到臥病在床皮包骨的您,尤其聽到您病逝消息的那刻! 成長的階段住在一起,人是親近,但心卻不算親近!重男親女是一個原因,一把捉住老重的權力卻多做出不合時宜的決定,這是我對阿嬤的印象,沒有人說的慈藹的回憶。 擔任理財顧問多年,見過很多長輩,聊過很多他人家事,自然也能感覺
Thumbnail
甚麼是Z字點子呢? 就如同書封上呈現的那樣,利用8個步驟連結成三個Z字,來激發自己的創意和點子。
Thumbnail
從9月30日起,在Naver、Kakao國(韓)語詞典中搜尋「초딩(初丁)」、「말라깽이(瘦皮猴)」、「계집(娘們)」、「머슴애(小廝)」等詞彙,都會同時標注詞彙的使用警示標語,響應韓國網路自律協會(KISO)的「認識歧視用詞」Campaign。
Thumbnail
記得從高中的階段開始,英文老師就會開始建議我們使用 "英英字典" 取代 "英漢字典" ,英文才能更進步,並逐漸練習用英文去思考。可是…… 因為,我們查一個簡單的單字,有可能在英文解釋裡面,卻用了更難更深的單字去解釋它!有時,為了查一個單字,變成要查15個單字!
Thumbnail
日文有所謂的高低音(類似英文的重音),很像中文發聲系統的第一聲和第三聲。高低音唸反了,在日文可是會把「神」(唸「咖米」)講錯成「頭髮」(唸「卡咪」)的,所以擁有標示重音的字典是很重要的事。自從看見網友說日本知名字典網站已取消單字的重音標示,我就趕快找了其他替代的重音兼發音字典,有一家app我特中意。
靜處一角落的妳 總是無言 但 我開門妳恆迎等著 當疑問人生難題 妳敞開雙臂擁我入懷 於妳浩瀚無涯愛情裡 任我挑弄尋戲 默默底 妳回應了我的饑渴
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
想要讓自己學外語更輕鬆,或快速了解外文的意思,千萬別錯過這份我個人私藏的清單,強烈推薦給你!對了,就算你還不是方格子會員,現在也可以不註冊會員直接手刀入手喔!
Thumbnail
【吳守禮與他的卡片盒筆記法】 吳守禮是日治時期第一代在臺灣本土培育的高教菁英,也是戰後臺灣大學文學院少數的本省籍師資。他的專長是臺灣閩南方言的研究,並於晚年投入臺語字典的編纂工作。
Thumbnail
這是本有意思的書,主題頗不尋常,講的是編字典的人。 對現代人來,字典是稀鬆平常的東西,尤其網路很方便,所謂字典,不過是游標固定在字上面就會自動跳出來的東西,遇到不認識的字,手機拍一下也能辨識,一切都那麼自然。 但其實一點也不自然,畢竟文字本身就是理性運作之下產出的東西,來源則是同樣由理性運作構成的語
Thumbnail
才發現埋怨總是用在親近的人身上,在看到臥病在床皮包骨的您,尤其聽到您病逝消息的那刻! 成長的階段住在一起,人是親近,但心卻不算親近!重男親女是一個原因,一把捉住老重的權力卻多做出不合時宜的決定,這是我對阿嬤的印象,沒有人說的慈藹的回憶。 擔任理財顧問多年,見過很多長輩,聊過很多他人家事,自然也能感覺
Thumbnail
甚麼是Z字點子呢? 就如同書封上呈現的那樣,利用8個步驟連結成三個Z字,來激發自己的創意和點子。
Thumbnail
從9月30日起,在Naver、Kakao國(韓)語詞典中搜尋「초딩(初丁)」、「말라깽이(瘦皮猴)」、「계집(娘們)」、「머슴애(小廝)」等詞彙,都會同時標注詞彙的使用警示標語,響應韓國網路自律協會(KISO)的「認識歧視用詞」Campaign。
Thumbnail
記得從高中的階段開始,英文老師就會開始建議我們使用 "英英字典" 取代 "英漢字典" ,英文才能更進步,並逐漸練習用英文去思考。可是…… 因為,我們查一個簡單的單字,有可能在英文解釋裡面,卻用了更難更深的單字去解釋它!有時,為了查一個單字,變成要查15個單字!
Thumbnail
日文有所謂的高低音(類似英文的重音),很像中文發聲系統的第一聲和第三聲。高低音唸反了,在日文可是會把「神」(唸「咖米」)講錯成「頭髮」(唸「卡咪」)的,所以擁有標示重音的字典是很重要的事。自從看見網友說日本知名字典網站已取消單字的重音標示,我就趕快找了其他替代的重音兼發音字典,有一家app我特中意。
靜處一角落的妳 總是無言 但 我開門妳恆迎等著 當疑問人生難題 妳敞開雙臂擁我入懷 於妳浩瀚無涯愛情裡 任我挑弄尋戲 默默底 妳回應了我的饑渴