返回

刷题练习:LeetCode 721. 账户合并

前端

LeetCode 721:账户合并——算法探索之旅

问题概要

LeetCode 721 题“账户合并”是一个常见的算法问题,它要求我们合并具有相同电子邮件地址的多个账户。每个账户包含一个名称和一个电子邮件地址,并按电子邮件地址分组提供。我们的目标是将这些账户合并成单一的账户,其中包含所有关联的名称。

解题思路

要解决这道题,我们可以采取以下步骤:

  1. 按电子邮件地址分组: 首先,我们将账户按电子邮件地址进行分组。这将使我们能够轻松地识别具有相同电子邮件地址的账户。

  2. 创建映射: 对于每个电子邮件地址,我们创建一个映射,该映射将名称存储为一个列表。这将允许我们跟踪每个电子邮件地址关联的所有名称。

  3. 合并账户: 遍历映射,并为每个电子邮件地址合并关联的名称和账户。在合并过程中,我们确保不重复添加名称。

  4. 按名称排序: 最后,我们为每个合并后的账户按名称排序名称列表。这将使输出更具可读性。

代码实现

我们可以使用 Python 代码来实现上述算法:

def accountsMerge(accounts):
  # 按电子邮件地址分组
  email_to_accounts = {}
  for account in accounts:
    email = account[1]
    if email not in email_to_accounts:
      email_to_accounts[email] = []
    email_to_accounts[email].append(account)

  # 创建映射
  name_to_emails = {}
  for account in accounts:
    name = account[0]
    email = account[1]
    if name not in name_to_emails:
      name_to_emails[name] = set()
    name_to_emails[name].add(email)

  # 合并账户
  merged_accounts = []
  for email in email_to_accounts:
    merged_account = [email_to_accounts[email][0][0]]
    for account in email_to_accounts[email]:
      for name in account[2:]:
        if name not in merged_account:
          merged_account.append(name)
    merged_accounts.append(merged_account)

  # 按名称排序
  for merged_account in merged_accounts:
    merged_account[1:] = sorted(merged_account[1:])
  
  return merged_accounts

常见问题解答

1. 为什么我们需要按电子邮件地址分组?

按电子邮件地址分组使我们能够轻松地识别具有相同电子邮件地址的账户。这对于合并具有多个名称的账户至关重要。

2. 创建映射有什么用?

映射使我们能够跟踪每个电子邮件地址关联的所有名称。这对于确保在合并账户时不重复添加名称很重要。

3. 如何按名称排序名称列表?

我们使用 sorted() 函数对名称列表按字母顺序进行排序。这使得合并后的账户更具可读性和一致性。

4. 为什么在合并过程中要避免重复添加名称?

重复添加名称会导致合并后的账户包含重复信息。通过确保不重复添加名称,我们可以生成一个干净且无冗余的合并账户列表。

5. 这道题的复杂度是多少?

这道题的时间复杂度为 O(n),其中 n 是账户的数量。这是因为我们需要遍历所有账户一次来进行分组、映射和合并操作。空间复杂度为 O(n),因为我们创建了一个映射来存储名称和电子邮件地址。