文章目录
- 1. 题目
- 2. 解题
1. 题目
描述
给n个人的朋友名单,告诉你user是谁,请找出user最可能认识的人。(他和user有最多的共同好友且他不是user的朋友)
n <= 500。
好友关系是相互的。(b若出现在a的好友名单中,a一定出现在b的好友名单中)
每个人的好友关系不超过 m 条,m <= 3000。
如果有两个人和user的共同好友数目一样,**编号更小**的那个认为是最可能认识的人。
如果user和所有陌生人都没有共同好友,输出-1。
示例
样例 1:
输入: list = [[1,2,3],[0,4],[0,4],[0,4],[1,2,3]], user = 0,
输出: 4。
解释:0和4不是朋友,并且他们有3个共同好友。所以4是0最可能认识的人。样例2:
输入:list = [[1,2,3,5],[0,4,5],[0,4,5],[0,5],[1,2],[0,1,2,3]],user = 0,
输出:4
解释:虽然5和0有3个共同好友,4和0只有2个共同好友,但是5是0的好友,所以4是0最可能认识的人。
https://tianchi.aliyun.com/oj/403980887914474330/460413730469122892
2. 解题
- 哈希记录 user 的所有好友
- 遍历除了 user 及其好友外的其他人,计算他们与 user 的共同好友数量
class Solution {
public:/*** @param friends: people's friends* @param user: the user's id* @return: the person who most likely to know*/int recommendFriends(vector<vector<int>> &friends, int user) {// Write your code here int n = friends.size();// user的好友集合unordered_set<int> user_f(friends[user].begin(), friends[user].end());int ans = -1, max_count = -1;for(int i = 0; i < n; ++i){if(i == user || user_f.count(i))// i 是 user 的好友不行continue;int count = 0;for(int j = 0; j < friends[i].size(); ++j){ // i 的 好友 j 也在 user 的好友列表中if(user_f.count(friends[i][j]))count++;}if(count && count > max_count){max_count = count;ans = i;}else if(count == max_count && i < ans)ans = i;}return ans;}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!