LeetCode--602. 好友申请 II :谁有最多的好友

58 阅读2分钟

1 题目描述

RequestAccepted 表:

+----------------+---------+  
| Column Name    | Type    |  
+----------------+---------+  
| requester_id   | int     |  
| accepter_id    | int     |  
| accept_date    | date    |  
+----------------+---------+  

(requester_id, accepter_id) 是这张表的主键 (具有唯一值的列的组合)
这张表包含发送好友请求的人的 ID, 接收好友请求的人的 ID, 以及好友请求通过的日期
编写解决方案, 找出拥有最多的好友的人和他拥有的好友数目
生成的测试用例保证拥有最多好友数目的只有 1 个人

2 测试用例

输入:
RequestAccepted 表:

+--------------+-------------+-------------+  
| requester_id | accepter_id | accept_date |  
+--------------+-------------+-------------+  
| 1            | 2           | 2016/06/03  |  
| 1            | 3           | 2016/06/08  |  
| 2            | 3           | 2016/06/08  |  
| 3            | 4           | 2016/06/09  |  
+--------------+-------------+-------------+  

输出:

+----+-----+  
| id | num |  
+----+-----+  
| 3  | 3   |  
+----+-----+  

解释:
编号为 3 的人是编号为 1, 2 和 4 的人的好友, 所以他总共有 3 个好友, 比其他人都多

3 解题思路

  1. 使用 union allrequester_id, accepter_id 聚合到同一个字段 id
+--+  
|id|  
+--+  
|2 |  
|3 |  
|4 |  
|3 |  
|4 |  
|1 |  
|1 |  
|1 |  
|2 |  
|3 |  
+--+  
  1. 对聚合后的 id 分组统计数量 num
select id, count(*) as num  
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra  
group by id  

查询结果

+--+---+  
|id|num|  
+--+---+  
|2 |2  |  
|3 |3  |  
|4 |2  |  
|1 |3  |  
+--+---+  
  1. num 倒序排序, 使用 limit 0,1 获取 num 最大的一条数据
select id, count(*) as num  
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra  
group by id  
order by num desc  
limit 1;  

查询结果

+--+---+  
|id|num|  
+--+---+  
|1 |3  |  
+--+---+  

4 进阶问题

在真实世界里, 可能会有多个人拥有好友数相同且最多, 你能找到所有这些人吗?

4.1 测试数据

+------------+-----------+-----------+  
|requester_id|accepter_id|accept_date|  
+------------+-----------+-----------+  
|1           |2          |2016-06-03 |  
|1           |3          |2016-06-08 |  
|1           |4          |2016-06-09 |  
|2           |3          |2016-06-08 |  
|3           |4          |2016-06-09 |  
+------------+-----------+-----------+  

4.2 解题思路

  1. 使用 union allrequester_id, accepter_id 聚合到同一个字段 id, 对聚合后的 id 分组统计数量 num, 使用 dense_rank()num 进行倒序排名
select id, count(*) as num, dense_rank() over (order by count(*) desc) as rk  
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra  
group by id  

查询结果

+--+---+--+  
|id|num|rk|  
+--+---+--+  
|3 |3  |1 |  
|1 |3  |1 |  
|2 |2  |2 |  
|4 |2  |2 |  
+--+---+--+  
  1. 查找排名为 1 的数据rk = 1, 就是好友数最多的信息 (包含好友数相同的场景)
select id, num from (select id, count(*) as num, dense_rank() over (order by count(*) desc) as rk  
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra  
group by id) as t  
where rk = 1;  

查询结果

+--+---+  
|id|num|  
+--+---+  
|3 |3  |  
|1 |3  |  
+--+---+