[LeetCode] 721. Accounts Merge_Medium tag: DFS recursive

Given a list accounts, each element accounts[i] is a list of strings, where the first element accounts[i][0] is a name, and the rest of the elements are emails representing emails of the account.

Now, we would like to merge these accounts. Two accounts definitely belong to the same person if there is some email that is common to both accounts. Note that even if two accounts have the same name, they may belong to different people as people could have the same name. A person can have any number of accounts initially, but all of their accounts definitely have the same name.

After merging the accounts, return the accounts in the following format: the first element of each account is the name, and the rest of the elements are emails in sorted order. The accounts themselves can be returned in any order.

Example 1:

Input: 
accounts = [["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "[email protected]", "[email protected]"], ["Mary", "[email protected]"]]
Output: [["John", '[email protected]', '[email protected]', '[email protected]'],  ["John", "[email protected]"], ["Mary", "[email protected]"]]
Explanation: 
The first and third John's are the same person as they have the common email "[email protected]".
The second John and Mary are different people as none of their email addresses are used by other accounts.
We could return these lists in any order, for example the answer [['Mary', '[email protected]'], ['John', '[email protected]'], 
['John', '[email protected]', '[email protected]', '[email protected]']] would still be accepted.

Note:

  • The length of accounts will be in the range [1, 1000].
  • The length of accounts[i] will be in the range [1, 10].
  • The length of accounts[i][j] will be in the range [1, 30].

这个题目思路就是先将input list转换成为一个以email为key, 然后account index的一个graph, 然后对于每个account index, 将所有的email都append进入一个set, 同时把它的邻居id的email都append进入set, 最后将它的name和sorted(emails set) append进入ans.

1. Constraints

1) 如以上note

2) 只是需要注意的是, 对于account没有email的来说, 我的思路会将account作为独立的account append进入ans里面, 但是题目并没有提及, 并且也没有相关的test cases. 

2. Ideas

DFS     

1) 转换为email 为key, account id 为value的dictionary

2) def dfs function, get all emails that each email in ids of the d

3) for each account, dfs 一遍, 并将sorted 结果append进入ans

4) return ans

3. Code

 1 class Solution:
 2     def MergeAccounts(self, accoutns):
 3         ans, d, visited = [], collections.defaultdict(set). set()
 4         for i , account in enumerate(accounts):
 5             for j in range(1, len(account)):
 6                 d[account[j]].add(i)
 7         def dfs(i, emails):
 8             if i not in visited:
 9                 visited.add(i)
10                 account = accounts[i]
11                 for j in range(1, len(account)):
12                     email = account[j]
13                     emails.add(email)
14                     for neig in d[email]:
15                         dfs(neig, emails)
16         for i, account in enumerate(accounts):
17             if i not in visited:
18                 name, emails = account[0], set()
19                 dfs(i, emails)
20                 ans.append([name], sorted(emails))
21         return ans

4. Test cases

accounts = [["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "[email protected]", "[email protected]"], ["Mary", "[email protected]"]]
Output: [["John", '[email protected]', '[email protected]', '[email protected]'],  ["John", "[email protected]"], ["Mary", "[email protected]"]]

猜你喜欢

转载自www.cnblogs.com/Johnsonxiong/p/9333728.html