力扣 2335 设计食物评分系统 学习笔记

原题:

设计一个支持下述操作的食物评分系统:

  • 修改 系统中列出的某种食物的评分。
  • 返回系统中某一类烹饪方式下评分最高的食物。

实现 FoodRatings 类:

  • FoodRatings(String[] foods, String[] cuisines, int[] ratings) 初始化系统。食物由 foodscuisines 和 ratings 描述,长度均为 n 。
    • foods[i] 是第 i 种食物的名字。
    • cuisines[i] 是第 i 种食物的烹饪方式。
    • ratings[i] 是第 i 种食物的最初评分。
  • void changeRating(String food, int newRating) 修改名字为 food 的食物的评分。
  • String highestRated(String cuisine) 返回指定烹饪方式 cuisine 下评分最高的食物的名字。如果存在并列,返回 字典序较小 的名字。

注意,字符串 x 的字典序比字符串 y 更小的前提是:x 在字典中出现的位置在 y 之前,也就是说,要么 x 是 y 的前缀,或者在满足 x[i] != y[i] 的第一个位置 i 处,x[i] 在字母表中出现的位置在 y[i] 之前。

我的解答采用模拟方法,即使知道可以采用最小堆使得changeRating复杂度从O(n)下降到O(log(n))但是不会搓,这里记录两个python的语法。

默认字典:

self.menu=defaultdict(list)

当访问一个不存在的键时,会返回一个默认的空列表。同样地,参数可以替换为int(default:0)或者自定义类。

判断键是否在字典中,可以用

d = dict()
if "key" in d:
    pass

来直接判断,也可以用get(key=)方法,键不存在时会返回null。

对于python,可以采用heapq模块创建一个堆,这里给出示例,也是题解:

import heapq
class FoodRatings:

    def __init__(self, foods: List[str], cuisines: List[str], ratings: List[int]):
        self.f={}
        self.c=defaultdict(list)
        for i in range(len(foods)):
            self.f[foods[i]]=[cuisines[i],ratings[i]]
            self.c[cuisines[i]].append((-ratings[i],foods[i]))
        for i in self.c.values():
            heapify(i) #从列表创建堆(最小堆)


    def changeRating(self, food: str, newRating: int) -> None:
        
        self.f[food][1]=newRating
        cui=self.f[food][0]
        heappush(self.c[cui],(-newRating,food)) #入堆

    def highestRated(self, cuisine: str) -> str:
        ans=self.c[cuisine]
        while -ans[0][0]!=self.f[ans[0][1]][1]:
            heappop(ans) #出堆
        return ans[0][1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值