1311. Get Watched Videos by Your Friends

这本质上就是一个深度优先遍历。

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;
    }
};
发布了361 篇原创文章 · 获赞 18 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/zeroQiaoba/article/details/104573167