题目地址:
https://leetcode.com/problems/design-a-food-rating-system/description/
每个食物有三个属性,菜系、评分和名字。每个食物只能属于一个菜系。要实现一个数据结构,可以做:
1、修改某个食物的评分;
2、返回某个菜系中评分最高的那个食物的名字。如果评分相同则返回名字字典序最小的那个食物的名字。
先用一个哈希表存每个菜系都有哪些食物及其评分,评分按从高到低排序。为了能修改评分,我们还需要一个哈希表存每个食物属于哪个菜系,并且这个食物评分是多少。这样修改的时候,先查一下这个食物的老的评分和菜系,再将该食物在哈希表里的评分信息改成新的评分。代码如下:
class FoodRatings {
public:
struct Food {
int rating;
string name;
bool operator<(const Food& o) const {
// 排在前面的应该是,要么评分高,要么评分相等但是名字字典序小
return rating > o.rating || (rating == o.rating && name < o.name);
}
};
unordered_map<string, set<Food>> mp;
unordered_map<string, string> c;
unordered_map<string, int> r;
FoodRatings(vector<string>& fs, vector<string>& cs, vector<int>& rs) {
int n = fs.size();
for (int i = 0; i < n; i++) {
mp[cs[i]].insert({rs[i], fs[i]});
c[fs[i]] = cs[i];
r[fs[i]] = rs[i];
}
}
void changeRating(string food, int newRating) {
auto& cui = c[food];
mp[cui].erase({r[food], food});
mp[cui].insert({newRating, food});
r[food] = newRating;
}
string highestRated(string cuisine) { return mp[cuisine].begin()->name; }
};
/**
* Your FoodRatings object will be instantiated and called as such:
* FoodRatings* obj = new FoodRatings(foods, cuisines, ratings);
* obj->changeRating(food,newRating);
* string param_2 = obj->highestRated(cuisine);
*/
初始化时间 O ( n log n ) O(n\log n) O(nlogn),操作 1 1 1时间 O ( l s log n ) O(l_s\log n) O(lslogn),操作 2 2 2时间 O ( l s ) O(l_s) O(ls),空间 O ( n l s ) O(nl_s) O(nls)。