【原创】leetCodeOj --- Candy 解题报告
2015-10-27 14:51
232 查看
题目地址:
https://leetcode.com/problems/candy/
题目内容:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
题目解析:
简单来讲,一个数组里的每个小孩都有权值,每个小孩都必须有一颗糖,而如果身边的小孩权值比自己低,那么自己就能多拿糖。
问最少能给几颗糖
容易看出,n个小孩,那么至少n颗糖,我们可以在这个基础上分配糖。
贪心算法:
从权值最小的小孩开始分起,每分到一个小孩时,看他是否比身边小孩的权值大,如果大,则比身边小孩最多糖数再多1;如果小,则不变。
为什么这个算法是对的?
0、由于权值比自己小的小孩已经处理过了,所以,后面不会出现权值比自己小的小孩获得的糖果数更新的情况,因此,自己的糖果数也不用更新。
1、由于每处理一个小孩,该小孩就不用再修改,所以从1块糖处理起时,每个小孩拿到的都是自己可以拿到的最小值。
具体代码:
https://leetcode.com/problems/candy/
题目内容:
Candy
Total Accepted: 43150 Total Submissions: 203841 Difficulty: HardThere are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
题目解析:
简单来讲,一个数组里的每个小孩都有权值,每个小孩都必须有一颗糖,而如果身边的小孩权值比自己低,那么自己就能多拿糖。
问最少能给几颗糖
容易看出,n个小孩,那么至少n颗糖,我们可以在这个基础上分配糖。
贪心算法:
从权值最小的小孩开始分起,每分到一个小孩时,看他是否比身边小孩的权值大,如果大,则比身边小孩最多糖数再多1;如果小,则不变。
为什么这个算法是对的?
0、由于权值比自己小的小孩已经处理过了,所以,后面不会出现权值比自己小的小孩获得的糖果数更新的情况,因此,自己的糖果数也不用更新。
1、由于每处理一个小孩,该小孩就不用再修改,所以从1块糖处理起时,每个小孩拿到的都是自己可以拿到的最小值。
具体代码:
class Solution(object): def candy(self, ratings): """ :type ratings: List[int] :rtype: int """ self.ratings = ratings if len(ratings) == 0: return 0 heap = list() candies = list() for i in range(len(ratings)): heap.append({'index':i,'value':ratings[i]}) candies.append(1) heap = sorted(heap, key=lambda x:x['value']) for i in range(len(heap)): self.get_candy(heap[i], candies) return sum(candies) def get_candy(self, item, candies): index = item['index'] value = item['value'] if index - 1 >= 0: if self.ratings[index - 1] < value: candies[index] = candies[index - 1] + 1 if index + 1 < len(candies): if self.ratings[index + 1] < value: if candies[index] < candies[index + 1] + 1: candies[index] = candies[index + 1] + 1
相关文章推荐
- OC语法
- 基于Jquery ajax技术实现间隔N秒向某页面传值
- linux 生产环境搭建
- AndroidStudio编译错误
- Spring Security教程(14)---- Logout和SessionManager
- Maven中央仓库信息速查
- Spring MVC兑现QQ第三方登录
- 关于在II7里面出现:当前信任级别设置不支持调试 的解决方法
- html5 应用缓存
- Xcode升级后插件失效的原理与修复办法
- C语言之内存对齐
- 一个很好地音频开发系列如果你看到了请仔细看
- 数据结构之线性表(二)
- Linux获取帮助等基础命令的使用
- Spring Security教程(12)---- 使用数据库来管理方法
- Spring Security教程(13)---- 验证码功能的实现
- linux系统中的简单拷贝文件代码
- 学生成绩信息的管理(java控制台)
- Windows 下Nexus搭建Maven私服
- UNIX索引技术访问文件初阶