【第317长场力扣周赛】最流行的视频创作者

68 阅读2分钟

 这道题当时比赛时没写出来,一直报编译错误,还以为是vector二维数组没有开辟大小导致的,后来结束发现是for循环的时候>写成了>=导致数组越界了,这个细节当时没有发现,有点可惜。

class Solution {
public:
    vector<vector<string>> mostPopularCreator(vector<string>& cr, vector<string>& ids, vector<int>& views) {
        unordered_map<string, long long> sum,vs;
        unordered_map<string, string> mxv;
        long long maxV = 0;
        
        for (int i = 0; i  <ids.size(); i ++) {
            sum[cr[i]] += (long long)views[i];
            maxV = max(sum[cr[i]], maxV);
            if (!vs.count(cr[i]) || views[i] > vs[cr[i]] || (views[i] == vs[cr[i]] && ids[i] < mxv[cr[i]])) {
                mxv[cr[i]] = ids[i], vs[cr[i]] = views[i];
            }
        }
        vector<vector<string>> res;
        for (auto &p : sum) 
            if (p.second == maxV) 
                res.push_back({p.first, mxv[p.first]});
        return res;
    }
};

补题的时候也学到了很多新东西。

  • map和unordered_map的区别

  • 增强for循环map键值对

  • map调用key和value的简便方法

1.map和unordered_map的区别

unordered_map 内部,使用的 Hash Table 对数据进行组织,通过把键值 key 映射到 hash 表中的一个位置进行访问,根据 hash 函数的特点, unordered_map 对于元素查找的时间复杂度可以达到 O(1) ,但是,它的元素排列是无序的。

unordered_map 元素无序,查询快,遍历慢。

map 的内部,使用了**「红黑树」red-black tree)来组织数据,因此默认的就已经实现了数据的排序。
不过,在存储上 map 却比较占用空间**,因为在红黑树中,每一个节点都要额外保存父节点和子节点的连接,因此使得每一个节点都占用较大空间来维护红黑树性质。

map元素有序,占空间。 

详细见zhuanlan.zhihu.com/p/210458185

2.增强for循环map键值对

其中sum是map<string,long long>类型的,我们对它进行增强for循环,那么每次提出的p是一个键值对。

3.map调用key和value的简便方法

我们看到的p.first和p.second指的就是map中键值对的key和value,非常方便,map也可以这样子使用。