| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Leetcode0135. 分发糖果(difficult) -> 正文阅读 |
|
[数据结构与算法]Leetcode0135. 分发糖果(difficult) |
目录 1. 题目描述
你需要按照以下要求,给这些孩子分发糖果:
请你给每个孩子分发糖果,计算并返回需要准备的?最少糖果数目?。 示例?1: 输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。 示例?2: 输入:ratings = [1,2,2] 输出:4 解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。 提示:
来源:力扣(LeetCode) 2. 解题分析2.1 思路? ? ? ? 显而易见的是,对于每个评分值为局部极小值(local minima)的小朋友,都只给一个糖果。 ? ? ? ? 然后从所有局部评分极小值出发向两边搜索,分别给位于两侧的小朋友分配糖果,直到两侧的极大值点。 ? ? ? ? 对于局部评分极大值点,从它的两侧的局部极小值点出发所得的糖果分配值可能不一样,比如说分数为[0,1,2,3,4,2,0],对于索引为4的学生而言,从左侧的0出发他应该得到5课糖果,从右侧的0出发则应该得到3课糖果,这种情况下,取两者中的最大值即可。 ? ? ? ? 如果每个人的分数都不相同,(运行效率另说)按照以上规则就可以解决了。 ? ? ? ? 但是,当出现连续多个人的分数相同的情况,由于两个分数相同的同学所得糖果没有约束,情况会变得比较复杂。可以分为以下三种情况来讨论(为了描述方便,称连续多个分数相同的构成一个平台区): ? ? ? ? case1:该平台区处于盆地谷底,即局部极小值区域。这种情况下,大家都分发一个糖果。 ? ? ? ? case2:该平台区处于峰顶,即局部极大值区域。这种情况下,两侧的学生分别根据自己那一侧的局部极小点向上搜索所得结果进行糖果分配。平台区域中间的学生分配一个糖果即可。 ? ? ? ? case3:该平台区处于上升段半山腰。这种情况下,左端的学生根据左侧的局部极小点向上搜索所得结果进行糖果分配。其余学生分配一个糖果即可。?? ? ? ? ? case4:该平台区处于下降段半山腰。这种情况下,右端的学生根据右侧的局部极小点向上搜索所得结果进行糖果分配。其余学生分配一个糖果即可。 ? ? ? ? 处于两端的平台区。左端平台区,除了最右侧端点按照上述规则进行判断,其余全部分配一个糖果;右端平台区,除了最左侧端点按照上述规则进行判断,其余全部分配一个糖果。 ? ? ? ? 话说。。。这个规则真的是太不公平了^-^. ? ? ? ? 好,如何用代码来实现以上搜索规则呢? 2.2 实现? ? ? ? 首先遍历ratings,将每个学生标记为以下几类:
? ? ? ? 然后,遍历每个极小值点,从每个极小值点出发向两边搜索,直到遇到极大值点或者标记为-1的点或者另一个极小值点为止。每走一步加一颗糖果。(对于极大值点)如果所分配的糖果数小于已分配的糖果数,则保持不变。 3. 代码实现
????????执行用时:112 ms, 在所有?Python3?提交中击败了6.00%的用户 ????????内存消耗:17.1 MB, 在所有?Python3?提交中击败了28.34%的用户 ? ? ? ? 虽然实现得很冗长,而且性能也很拉胯,但是毕竟是自己手撕的difficult级别的题目,还是得鼓励一下自己。 ???????? ????????官解摘录如下(其实思路是相近的,只是我的实现手法太差),留待慢慢消化:
????????官解还给出了“方法二:常数空间遍历”,不过说明起来比较长,暂且免了。 ? ? ? ? 回到总目录:笨牛慢耕的Leetcode每日一题总目录(动态更新。。。) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:49:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |