[LeetCode] Design a Food Rating System

2353. Design a Food Rating System

Design a food rating system that can do the following:

  • Modify the rating of a food item listed in the system.
  • Return the highest-rated food item for a type of cuisine in the system.

Implement the FoodRatings class:

  • FoodRatings(String[] foods, String[] cuisines, int[] ratings) Initializes the system. The food items are described by foods, cuisines and ratings, all of which have a length of n.
  • foods[i] is the name of the ith food,
  • cuisines[i] is the type of cuisine of the ith food, and
  • ratings[i] is the initial rating of the ith food.
  • void changeRating(String food, int newRating) Changes the rating of the food item with the name food.
  • String highestRated(String cuisine) Returns the name of the food item that has the highest rating for the given type of cuisine. If there is a tie, return the item with the lexicographically smaller name.

Note that a string x is lexicographically smaller than string y if x comes before y in dictionary order, that is, either x is a prefix of y, or if i is the first position such that x[i] != y[i], then x[i] comes before y[i] in alphabetic order.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Compare {
public:
bool operator() (pair<int, string> a, pair<int, string> b) {
if(a.first == b.first) return a.second > b.second;
return a.first < b.first;
}
};

class FoodRatings {
unordered_map<string, string> cmp;
unordered_map<string, int> rmp;
unordered_map<string, priority_queue<pair<int, string>, vector<pair<int, string>>, Compare>> rate;
public:
FoodRatings(vector<string>& foods, vector<string>& cuisines, vector<int>& ratings) {
int n = foods.size();
for(int i = 0; i < n; i++) {
cmp[foods[i]] = cuisines[i];
rmp[foods[i]] = ratings[i];
rate[cuisines[i]].push({ratings[i], foods[i]});
}
}

void changeRating(string food, int newRating) {
rmp[food] = newRating;
rate[cmp[food]].push({newRating, food});
}

string highestRated(string cuisine) {
auto& heap = rate[cuisine];
while(rmp[heap.top().second] != heap.top().first) {
heap.pop();
}
return heap.top().second;
}
};

/**
* 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);
*/
Author: Song Hayoung
Link: https://songhayoung.github.io/2022/07/24/PS/LeetCode/design-a-food-rating-system/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.