Similar Problems

Similar Problems not available

Accounts Merge - Leetcode Solution


LeetCode:  Accounts Merge Leetcode Solution

Difficulty: Medium

Topics: hash-table depth-first-search union-find string breadth-first-search array sorting  

The Accounts Merge problem on LeetCode is a problem in which we have to merge two or more accounts with the same owner. Each account includes a list of emails, which means that if two or more accounts have the same email, then they should be merged. We have to return a list of accounts that have been merged.

Let's start with understanding the problem statement.

Problem Statement: Given a list of accounts where each account has a name and a list of emails, merge the accounts with the same email.


The input to this problem is a list of accounts. Each account is represented as a list of strings, where the first element is the name of the account, and the remaining elements are the emails associated with the account.


The output of this problem should be a list of merged accounts. Each merged account should have the same name as the corresponding account in the input list and should include all the emails that were associated with the corresponding accounts in the input list.


We can solve this problem by using the Union-Find algorithm. We will create a disjoint-set of all the emails, where each email is represented as a node in the disjoint-set. We will also create a hashmap to map each email to an account. Initially, each email node will belong to its own set.

We will then iterate through each account and add a relationship between the email nodes in the account. For each account, we will loop over its email nodes. For each email node, we will merge it with the first email node in the account.

After all the account nodes have been merged, we will create a new hashmap and populate it with the representative email node and the list of emails associated with it. Finally, we will iterate through this hashmap and add the merged accounts to the answer list.


class EmailNode:
    def __init__(self, email, account): = email
        self.account = account
        self.parent = self

class Solution:
    def accountsMerge(self, accounts):
        # create disjoint-set for email nodes
        email_nodes = {email: EmailNode(email, account) for account in range(len(accounts)) for email in accounts[account][1:]}
        # merge email nodes in each account
        for account in range(len(accounts)):
            for i in range(1, len(accounts[account])-1):
                self.union(email_nodes[accounts[account][i]], email_nodes[accounts[account][i+1]])
        # create hashmap with representative email nodes
        merged_accounts = {}
        for email in email_nodes:
            parent = self.find(email_nodes[email])
            if parent not in merged_accounts:
                merged_accounts[parent] = [accounts[parent.account][0], []]
        # create list of merged accounts
        ans = []
        for account in merged_accounts.values():
            ans.append([account[0]] + account[1])
        return ans
    def union(self, node1, node2):
        root1 = self.find(node1)
        root2 = self.find(node2)
        if root1 != root2:
            root2.parent = root1
    def find(self, node):
        if node.parent == node:
            return node
        node.parent = self.find(node.parent)
        return node.parent

Time Complexity:

The time complexity of the above algorithm is O(n log n), where n is the total number of emails in all accounts. This is because we execute a union-find operation on each of the emails, which requires log n time. We also iterate over each account and each email in the account, which takes O(n) time. Therefore, the overall time complexity is O(n log n).

Space Complexity:

The space complexity of the above algorithm is O(n), where n is the total number of emails in all accounts. This is because we need to store all the email nodes in the disjoint-set and the hashmap.

Accounts Merge Solution Code