ETH官方钱包

前往
大廳
主題

LeetCode - 2076. Process Restricted Friend Requests 解題心得

Not In My Back Yard | 2022-05-11 12:00:05 | 巴幣 0 | 人氣 189

題目連結:


題目意譯:
你被給定一整數 n 代表著一網路中的人數。每個人被編號為 0 到 n - 1。

你同時也被給定一個索引值從 0 開始之二維整數陣列 restrictions,其中 restrictions[i] = [xi, yi] 意味著編號 xi 的人與編號 yi 的人不能成為朋友,不論是直接地還是經由他人間接地成為朋友。

一開始,沒有人是彼此的朋友。你被給定一個索引值從 0 開始之二維整數陣列 requests 作為好友請求序列,其中 requests[j] = [uj, vj] 為一個編號 uj 的人與編號 vj 的人之間的好友請求。

如果 uj 和 vj 可以成為朋友,則該好友請求是成功的。每個好友請求根據其給定順序來處理(即,requests[j] 發生於 requests[j + 1] 之前),且 uj 和 vj 將對於未來所有其他的好友請求都是直接性的朋友。

回傳一個布林陣列 result,其中每個 result[j] 為真(True)如果第 j 個朋友請求是成功的;反之,為假(False)。

注: 如果 uj 和 vj 已經是直接的朋友了,該次請求依舊算為成功。

限制:
2 ≦ n ≦ 1000
0 ≦ restrictions.length ≦ 1000
restrictions[i].length == 2
0 ≦ xi, yi ≦ n - 1
xi != yi
1 ≦ requests.length ≦ 1000
requests[j].length == 2
0 ≦ uj, vj ≦ n - 1
uj != vj



範例測資:
範例 1:
輸入: n = 3, restrictions = [[0,1]], requests = [[0,2],[2,1]]
輸出: [true,false]
解釋:
請求 0:編號 0 與編號 2 可以成為朋友,所以他們便成為了直接的朋友。
請求 1:編號 2 和編號 1 無法成為朋友,因為編號 0 和編號 1 將會變成間接的朋友(1--2--0)。

範例 2:
輸入: n = 3, restrictions = [[0,1]], requests = [[1,2],[0,2]]
輸出: [true,false]
解釋:
請求 0:編號 1 與編號 2 可以成為朋友,所以他們便成為了直接的朋友。
請求 1:編號 0 和編號 2 無法成為朋友,因為編號 0 和編號 1 將會變成間接的朋友(0--2--1)。

範例 3:
輸入: n = 5, restrictions = [[0,1],[1,2],[2,3]], requests = [[0,4],[1,2],[3,1],[3,4]]
輸出: [true,false,true,false]
解釋:
請求 0:編號 0 與編號 4 可以成為朋友,所以他們便成為了直接的朋友。
請求 1:編號 1 和編號 2 無法成為朋友,因為他們之間有直接的限制。
請求 2:編號 3 與編號 1 可以成為朋友,所以他們便成為了直接的朋友。
請求 3:編號 3 和編號 4 無法成為朋友,因為編號 0 和編號 1 將會變成間接的朋友(0--4--3--1)。


解題思維:
這題可以簡單地從併查集(Union-Find Set)修改一下便可以解掉。

這題中有介紹過併查集,而一般的表示法為森林(Forest)的方式。

而原本一般是取樹中某個節點作為「代表」(Representative),其將儲存著其下(即該棵樹整體)有幾個節點,且每個節點存自己的 parent。現在我們可以讓「代表」多存一些資訊——即現在它所在的樹是哪些節點(建議用布林陣列表示誰在、誰不在比較方便)以及整棵樹的所有節點限制合併後不能跟哪些節點作為朋友。然後合併的時候,利用這些資訊判斷可不可以合併(成為直接的朋友)。不行就回傳假;可以的話,記得更新這些資訊,並回傳真即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作