这本质上就是一个深度优先遍历。
class Solution {
public:
// n people: id [0, n-1];
// watchedVideos (a list of video), friends (a list of pople)
// i看的电影以及i的朋友们有多少?
// 第k层是到你最短路径下,路径
// id, level => return the list of videos (返回频率)
vector<string> watchedVideosByFriends(vector<vector<string>>& watchedVideos, vector<vector<int>>& friends, int id, int level) {
// save whether used
vector<bool> used(friends.size(), 0);
used[id] = 1;
// save init values
vector<int> levelfrients;
queue<int> ids;
queue<int> levels;
ids.push(id);
levels.push(0);
while(!ids.empty()){
int nowid = ids.front();
int nowlevel = levels.front();
vector<int> nextids = friends[nowid];
int nextlevel = nowlevel + 1;
for(int i=0;i<nextids.size();i++){
if (used[nextids[i]]==0){
ids.push(nextids[i]);
levels.push(nextlevel);
if (nextlevel==level){
levelfrients.push_back(nextids[i]);
}
used[nextids[i]]=1;
}
}
ids.pop();
levels.pop();
}
// return level frients
for(int i=0;i<levelfrients.size();i++){
cout<<levelfrients[i]<<" ";
}
// for videos
unordered_map<string,int> mymap;
for(int i=0;i<levelfrients.size();i++){
int level = levelfrients[i];
vector<string> videos = watchedVideos[level];
for(int j=0;j<videos.size();j++){
string video = videos[j];
if(mymap.count(video)==0){
mymap.insert({video, 1});
}
else{
mymap[video]++;
}
}
}
map<int, vector<string>> res; // from small->big
for(auto it = mymap.begin();it!=mymap.end();it++){
string key = it->first;
int value = it->second;
if (res.find(value)!=res.end()){
res[value].push_back(key);
}
else{
vector<string> temp(1, key);
res[value] = temp;
}
}
vector<string> result;
for(auto it = res.begin();it!=res.end();it++){
vector<string> value = it->second;
sort(value.begin(), value.end());
for(int j=0;j<value.size();j++){
result.push_back(value[j]);
}
}
return result;
}
};