Skip to main content
Back to problems
#3058
Medium Database

Friends with no mutual friends

Database
48.7% acceptance
Mar 31, 2026
20
3

No description available.

Solution

Pandas
Time O(1)
Space O(1)
LeetCode
solution.pandas
# Table: Friends
# 
# +-------------+------+
# | Column Name | Type |
# +-------------+------+
# | user_id1    | int  |
# | user_id2    | int  |
# +-------------+------+
# (user_id1, user_id2) is the primary key (combination of columns with unique values) for this table.
# Each row contains user id1, user id2, both of whom are friends with each other.
# 
# Write a solution to find all pairs of users who are friends with each other and have no mutual friends.
# 
# Return the result table ordered by user_id1, user_id2 in ascending order.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# Friends table:
# +----------+----------+
# | user_id1 | user_id2 |
# +----------+----------+
# | 1        | 2        |
# | 2        | 3        |
# | 2        | 4        |
# | 1        | 5        |
# | 6        | 7        |
# | 3        | 4        |
# | 2        | 5        |
# | 8        | 9        |
# +----------+----------+
# Output:
# +----------+----------+
# | user_id1 | user_id2 |
# +----------+----------+
# | 6        | 7        |
# | 8        | 9        |
# +----------+----------+
# Explanation:
# - Users 1 and 2 are friends with each other, but they share a mutual friend with user ID 5, so this pair is not included.
# - Users 2 and 3 are friends, they both share a mutual friend with user ID 4, resulting in exclusion, similarly for users 2 and 4 who share a mutual friend with user ID 3, hence not included.
# - Users 1 and 5 are friends with each other, but they share a mutual friend with user ID 2, so this pair is not included.
# - Users 6 and 7, as well as users 8 and 9, are friends with each other, and they don't have any mutual friends, hence included.
# - Users 3 and 4 are friends with each other, but their mutual connection with user ID 2 means they are not included, similarly for users 2 and 5 are friends but are excluded due to their mutual connection with user ID 1.
# Output table is ordered by user_id1 in ascending order.

import pandas as pd

def friends_with_no_mutual_friends(friends: pd.DataFrame) -> pd.DataFrame:
  # Build symmetric edges
  edges = pd.concat([
    friends[['user_id1', 'user_id2']],
    friends[['user_id2', 'user_id1']].rename(columns={'user_id2': 'user_id1', 'user_id1': 'user_id2'})
  ])
  # For each pair, check if any neighbor of user_id1 is also neighbor of user_id2
  neighbors = edges.groupby('user_id1')['user_id2'].apply(set).to_dict()
  def has_mutual(row):
    n1 = neighbors.get(row['user_id1'], set())
    n2 = neighbors.get(row['user_id2'], set())
    return len(n1 & n2) > 0
  mask = friends.apply(has_mutual, axis=1)
  result = friends[~mask][['user_id1', 'user_id2']]
  return result.sort_values(['user_id1', 'user_id2']).reset_index(drop=True)