Skip to main content
Back to problems
#1892
Hard Database

Page recommendations ii

Database
45.6% acceptance
Mar 31, 2026
93
23

No description available.

Solution

Pandas
Time O(n)
Space O(1)
LeetCode
solution.pandas
# Table: Friendship
# 
# +---------------+---------+
# | Column Name   | Type    |
# +---------------+---------+
# | user1_id      | int     |
# | user2_id      | int     |
# +---------------+---------+
# (user1_id, user2_id) is the primary key (combination of columns with unique values) for this table.
# Each row of this table indicates that the users user1_id and user2_id are friends.
# 
#  
# 
# Table: Likes
# 
# +-------------+---------+
# | Column Name | Type    |
# +-------------+---------+
# | user_id     | int     |
# | page_id     | int     |
# +-------------+---------+
# (user_id, page_id) is the primary key (combination of columns with unique values) for this table.
# Each row of this table indicates that user_id likes page_id.
# 
#  
# 
# You are implementing a page recommendation system for a social media website. Your system will recommend a page to user_id if the page is liked by at least one friend of user_id and is not liked by user_id.
# 
# Write a solution to find all the possible page recommendations for every user. Each recommendation should appear as a row in the result table with these columns:
# 
# user_id: The ID of the user that your system is making the recommendation to.
# 
# page_id: The ID of the page that will be recommended to user_id.
# 
# friends_likes: The number of the friends of user_id that like page_id.
# 
# Return the result table in any order.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# Friendship table:
# +----------+----------+
# | user1_id | user2_id |
# +----------+----------+
# | 1        | 2        |
# | 1        | 3        |
# | 1        | 4        |
# | 2        | 3        |
# | 2        | 4        |
# | 2        | 5        |
# | 6        | 1        |
# +----------+----------+
# Likes table:
# +---------+---------+
# | user_id | page_id |
# +---------+---------+
# | 1       | 88      |
# | 2       | 23      |
# | 3       | 24      |
# | 4       | 56      |
# | 5       | 11      |
# | 6       | 33      |
# | 2       | 77      |
# | 3       | 77      |
# | 6       | 88      |
# +---------+---------+
# Output:
# +---------+---------+---------------+
# | user_id | page_id | friends_likes |
# +---------+---------+---------------+
# | 1       | 77      | 2             |
# | 1       | 23      | 1             |
# | 1       | 24      | 1             |
# | 1       | 56      | 1             |
# | 1       | 33      | 1             |
# | 2       | 24      | 1             |
# | 2       | 56      | 1             |
# | 2       | 11      | 1             |
# | 2       | 88      | 1             |
# | 3       | 88      | 1             |
# | 3       | 23      | 1             |
# | 4       | 88      | 1             |
# | 4       | 77      | 1             |
# | 4       | 23      | 1             |
# | 5       | 77      | 1             |
# | 5       | 23      | 1             |
# +---------+---------+---------------+
# Explanation:
# Take user 1 as an example:
# - User 1 is friends with users 2, 3, 4, and 6.
# - Recommended pages are 23 (user 2 liked it), 24 (user 3 liked it), 56 (user 3 liked it), 33 (user 6 liked it), and 77 (user 2 and user 3 liked it).
# - Note that page 88 is not recommended because user 1 already liked it.
# 
# Another example is user 6:
# - User 6 is friends with user 1.
# - User 1 only liked page 88, but user 6 already liked it. Hence, user 6 has no recommendations.
# 
# You can recommend pages for users 2, 3, 4, and 5 using a similar process.

import pandas as pd

def recommend_page(friendship: pd.DataFrame, likes: pd.DataFrame) -> pd.DataFrame:
  # Make friendship bidirectional
  friends = pd.concat([
    friendship[['user1_id', 'user2_id']].rename(columns={'user1_id': 'user_id', 'user2_id': 'friend_id'}),
    friendship[['user1_id', 'user2_id']].rename(columns={'user2_id': 'user_id', 'user1_id': 'friend_id'})
  ])

  # Join friends with their liked pages
  friend_likes = friends.merge(likes, left_on='friend_id', right_on='user_id', suffixes=('', '_like'))
  friend_likes = friend_likes[['user_id', 'page_id']]

  # Count friends_likes per user per page
  counts = friend_likes.groupby(['user_id', 'page_id']).size().reset_index(name='friends_likes')

  # Remove pages already liked by the user
  result = counts.merge(likes, on=['user_id', 'page_id'], how='left', indicator=True)
  result = result[result['_merge'] == 'left_only'][['user_id', 'page_id', 'friends_likes']]

  return result