描述
給n個人的朋友名單,告訴你user,請找出user最可能認識的人。(他和user有最多的共同好友且他不是user的朋友)
n <= 500。
好友關係是相互的。(b若出現在a的好友名單中,a一定出現在b的好友名單中)
每個人的好友關係不超過 m 條,m <= 3000。
如果有兩個人和user的共同好友數目一樣,編號更小的那個認爲是最可能認識的人。
如果user和所有陌生人都沒有共同好友,輸出-1。
樣例
給出 list = [[1,2,3],[0,4],[0,4],[0,4],[1,2,3]], user = 0, 返回 4。
解釋:
0和4不是朋友,並且他們有3個共同好友。所以4是0最可能認識的人。
給出 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最可能認識的人。
思路
首先找到不是user朋友的人,再根據user的朋友名單,計算出和user的共同好友數,結果返回最多共同好友的人。
#ifndef C1402_H
#define C1402_H
#include<iostream>
#include<vector>
#include<map>
#include <algorithm>
using namespace std;
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
if (friends.empty())
return -1;
int num = friends.size();
//res存放不是user的朋友的人與user共同好友的個數
map<int, int> res;
if (friends[user].empty())
return -1;
//dic[i]=1表示i是user或者是user的朋友,dic[i]=0表示i不是user的朋友
vector<int> dic(num, 0);
dic[user] = 1;
for (auto c : friends[user])
{
dic[c] = 1;
}
//找到不是user好友的人
for (int i = 0; i < num; ++i)
{
if (dic[i] == 0)
res[i] = 0;
}
//根據user的好友名單更新res
for (auto c : friends[user])
{
for (auto t : friends[c])
{
if (res.find(t) != res.end())
res[t]++;
}
}
int Max = 0;
int person = -1;
//找到有最多共同好友的人
for (auto c : res)
{
if (c.second > Max)
{
Max = c.second;
person = c.first;
}
}
return person;
}
};
#endif