2353.设计食物评分系统:哈希表 + 有序集合
【LetMeFly】2353.设计食物评分系统:哈希表 + 有序集合
力扣题目链接:https://leetcode.cn/problems/design-a-food-rating-system/
设计一个支持下述操作的食物评分系统:
- 修改 系统中列出的某种食物的评分。
- 返回系统中某一类烹饪方式下评分最高的食物。
实现 FoodRatings 类:
FoodRatings(String[] foods, String[] cuisines, int[] ratings)初始化系统。食物由foods、cuisines和ratings描述,长度均为n。<ul> <li><code>foods[i]</code> 是第 <code>i</code> 种食物的名字。</li> <li><code>cuisines[i]</code> 是第 <code>i</code> 种食物的烹饪方式。</li> <li><code>ratings[i]</code> 是第 <code>i</code> 种食物的最初评分。</li> </ul> </li> <li><code>void changeRating(String food, int newRating)</code> 修改名字为 <code>food</code> 的食物的评分。</li> <li><code>String highestRated(String cuisine)</code> 返回指定烹饪方式 <code>cuisine</code> 下评分最高的食物的名字。如果存在并列,返回 <strong>字典序较小</strong> 的名字。</li>
注意,字符串 x 的字典序比字符串 y 更小的前提是:x 在字典中出现的位置在 y 之前,也就是说,要么 x 是 y 的前缀,或者在满足 x[i] != y[i] 的第一个位置 i 处,x[i] 在字母表中出现的位置在 y[i] 之前。
示例:
输入
["FoodRatings", "highestRated", "highestRated", "changeRating", "highestRated", "changeRating", "highestRated"]
[[["kimchi", "miso", "sushi", "moussaka", "ramen", "bulgogi"], ["korean", "japanese", "japanese", "greek", "japanese", "korean"], [9, 12, 8, 15, 14, 7]], ["korean"], ["japanese"], ["sushi", 16], ["japanese"], ["ramen", 16], ["japanese"]]
输出
[null, "kimchi", "ramen", null, "sushi", null, "ramen"]
解释
FoodRatings foodRatings = new FoodRatings(["kimchi", "miso", "sushi", "moussaka", "ramen", "bulgogi"], ["korean", "japanese", "japanese", "greek", "japanese", "korean"], [9, 12, 8, 15, 14, 7]);
foodRatings.highestRated("korean"); // 返回 "kimchi"
// "kimchi" 是分数最高的韩式料理,评分为 9 。
foodRatings.highestRated("japanese"); // 返回 "ramen"
// "ramen" 是分数最高的日式料理,评分为 14 。
foodRatings.changeRating("sushi", 16); // "sushi" 现在评分变更为 16 。
foodRatings.highestRated("japanese"); // 返回 "sushi"
// "sushi" 是分数最高的日式料理,评分为 16 。
foodRatings.changeRating("ramen", 16); // "ramen" 现在评分变更为 16 。
foodRatings.highestRated("japanese"); // 返回 "ramen"
// "sushi" 和 "ramen" 的评分都是 16 。
// 但是,"ramen" 的字典序比 "sushi" 更小。
提示:
1 <= n <= 2 * 104n == foods.length == cuisines.length == ratings.length1 <= foods[i].length, cuisines[i].length <= 10foods[i]、cuisines[i]由小写英文字母组成1 <= ratings[i] <= 108foods中的所有字符串 互不相同- 在对
changeRating的所有调用中,food是系统中食物的名字。 - 在对
highestRated的所有调用中,cuisine是系统中 至少一种 食物的烹饪方式。 - 最多调用
changeRating和highestRated总计2 * 104次
解题方法:设计
哈希表可以通过一个值快速找到拎一个值,有序集合可以快速插入删除一些值并保持集合中元素的有序性。
- 创建一个哈希表,由food查询cuisine和rating;
- 创建一个哈希表,由cuisine查询所有使用这个cuisine的
(food, rating)集合,集合的排序方式是rating大优先然后字典序小优先。
修改评分时,先由food查询出cuisine和rating,再由cuisine查询出使用这个cuisine的(food, rating)集合,删除旧的(food, rating)对,插入新的(food, rating)对。
查询时,由cuisine查询出使用这个cuisine的(food, rating)集合,因为是有序的,所以集合中的第一个元素对就是我们所求。
- 时间复杂度:初始化$O(n\log n)$,单次操作$O(\log n)$,其中$n$是食物数量
- 空间复杂度$O(n)$
AC代码
C++
1 | |
Python
1 | |
Java
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源
2353.设计食物评分系统:哈希表 + 有序集合
https://blog.letmefly.xyz/2025/02/28/LeetCode 2353.设计食物评分系统/