2353. 设计食物评分系统
核心思想:首先明确我们有哪些功能,首先是修改某种食物分数的功能,然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a = 食物[分数],b = 烹饪方式[分数,食物名字]
然后有一点经验的感觉,就是使用堆,每次从堆中弹出最大分数的食物名字,然后修改的时候,只需要把修改的结果放入堆中,然后等到需要弹出的时候,比对分数是否一致,不一致便弹出这个结果,继续寻找,从而形成了叫懒惰堆的说法,然后其中有一个细节就是我们使用的是最小堆,没有弹最大的,所以将分数加负号放入其中。
1895. 最大的幻方
核心思想:这题其实思想很简单,就是枚举,首先是从最大可能的幻方开始枚举,然后枚举它的起始点,然后判断行,判断列,判断对角线是否合格,在判断行和列的时候可以使用前缀和来优化,比较考验耐心和细节。
842. 将数组拆分成斐波那契序列
核心思想:这题很明显是一道回溯的题目,但是它的细节特别多,首先是check(index),check(start)感觉更好一点,就是表示从start开始拆分num,num[start:i],代码中的i更像是end,num[start:end],主要逻辑就是枚举起始点为index时候的终点i,curr=num[index:i]然后如果len(ans) < 2或者curr满足题意,直接就把curr装入ans,然后新curr的起点就是i+1,继续拆分。然后为True的话就直接返回,如果不行就回溯重新拆分。
主要部分:
整体代码: