news 2026/4/15 13:55:12

LC.2353 | 设计食物评分系统 | 有序集合 | 负分数排序实现“最高分优先 + 字典序优先”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LC.2353 | 设计食物评分系统 | 有序集合 | 负分数排序实现“最高分优先 + 字典序优先”

输入:

  • FoodRatings(foods, cuisines, ratings):初始化 n 种食物
  • changeRating(food, newRating):修改某个食物评分
  • highestRated(cuisine):查询某种烹饪方式下评分最高的食物(若并列取字典序更小)

要求:

  • 评分最高优先
  • 评分相同按字典序最小优先
  • 支持多次修改与查询

输出:

  • highestRated返回食物名

思路:

这题核心就是维护两个维度的信息:

1)食物 -> (菜系, 当前评分)

unordered_map<string, pair<string,int>> food_info存:

  • 方便changeRating(food, ...)时,O(1) 找到它属于哪个菜系 + 旧评分是多少。

2)菜系 -> 一棵有序结构,能随时拿到“最强的那个”

unordered_map<string, set<pair<int,string>>> cuisine_ratings存:

  • 每个菜系一个set,里面放(-rating, food)这样的二元组。
  • set默认按 pair 从小到大排序:
    • -rating越小,代表rating越大(最高分排最前)
    • -rating相同,就比较food字符串(字典序小的排前)
  • 所以highestRated(cuisine)直接返回begin()->second即可。

changeRating 怎么做?

对一个食物:

  1. food_info取出它的cuisineoldRating
  2. 在对应set里删除旧键(-oldRating, food)
  3. 插入新键(-newRating, food)
  4. 更新food_info[food].second = newRating

这样能保证每次修改后,菜系的“冠军”始终在set.begin()


复杂度:

  • 时间复杂度:
    • 初始化:O(N log N)(每次插入 set)
    • changeRating:O(log M)(M 为该 cuisine 下食物数)
    • highestRated:O(1)(取 begin)
  • 空间复杂度:O(N)

classFoodRatings{private:unordered_map<string,pair<string,int>>food_info;unordered_map<string,set<pair<int,string>>>cuisine_ratings;public:FoodRatings(vector<string>&foods,vector<string>&cuisines,vector<int>&ratings){for(inti=0;i<(int)foods.size();++i){food_info[foods[i]]={cuisines[i],ratings[i]};cuisine_ratings[cuisines[i]].insert({-ratings[i],foods[i]});}}voidchangeRating(string food,intnewRating){auto&info=food_info[food];string cuisine=info.first;intoldRating=info.second;cuisine_ratings[cuisine].erase({-oldRating,food});cuisine_ratings[cuisine].insert({-newRating,food});info.second=newRating;}stringhighestRated(string cuisine){returncuisine_ratings[cuisine].begin()->second;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 8:55:06

LC.846 | 一手顺子 | 有序集合| map计数

输入&#xff1a; 整数数组 hand 表示手里的牌面值整数 groupSize 表示每组顺子的长度 要求&#xff1a; 把所有牌分成若干组每组必须是 groupSize 张连续牌能分完返回 true&#xff0c;否则 false 输出&#xff1a; bool思路&#xff1a; 这题的关键不是“怎么凑一组顺子”&am…

作者头像 李华
网站建设 2026/4/4 19:39:37

SSH免密码登录配置:提升PyTorch镜像操作效率

SSH免密码登录配置&#xff1a;提升PyTorch镜像操作效率 在现代深度学习开发中&#xff0c;一个常见的场景是&#xff1a;你正坐在本地工作站前&#xff0c;准备调试一段训练脚本。远程服务器上的容器已经跑起来了&#xff0c;GPU 也已就绪&#xff0c;但每次 ssh 连接、每次 s…

作者头像 李华
网站建设 2026/4/2 19:34:11

Git rebase vs merge:PyTorch项目协作规范建议

Git rebase vs merge&#xff1a;PyTorch项目协作规范建议 在深度学习项目的实际开发中&#xff0c;一个看似微不足道的 Git 操作选择——是用 merge 还是 rebase&#xff0c;往往会在几个月后成为团队回溯 bug 时的“灾难源头”。尤其当多个研究员同时在 PyTorch 项目上迭代模…

作者头像 李华
网站建设 2026/4/14 14:19:03

GitHub Issue模板设计:收集用户关于镜像的反馈

GitHub Issue模板设计&#xff1a;收集用户关于镜像的反馈 在深度学习项目开发中&#xff0c;一个常见的痛点是环境配置——明明在本地跑得好好的模型&#xff0c;换到服务器上却“水土不服”。PyTorch 与 CUDA 的版本兼容性问题、驱动缺失、依赖库冲突……这些问题让不少开发者…

作者头像 李华
网站建设 2026/4/13 22:45:41

《机器学习SVM从零到精通:图解最优超平面与软间隔实战》

文章目录 SVM一.SVM是什么&#xff1f;二.怎么学习SVM&#xff1f;三.为什么学习SVM&#xff1f;四.深入理解SVMdata -> 数据classifier -> 分类器optimization -> 最优化kernelling -> 核函数hyperplane -> 超平面 如何选取一个最佳的超平面Small Margin&#…

作者头像 李华
网站建设 2026/4/11 20:41:03

【Excel VBA 编程】第68讲:从结构体向数据字典的务实转型

在前两期&#xff0c;我们主要采用“结构体&#xff08;Type&#xff09; 函数”的方式来构建复杂的数据模型。这种方式的优点在于结构清晰、逻辑明确&#xff0c;便于理解和上手。然而&#xff0c;它也存在一些不足&#xff1a;数据与行为仅实现了初步解耦&#xff0c;数据扩展…

作者头像 李华