LeetCode -- Candy
2015-08-25 16:11
369 查看
题目:
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?
就是给定1个rating数组,表示每个娃所得的评分。现在要求:
1.给每个娃至少分1个candy
2.分高的娃要比邻居所得的candy多
3.尽量少分candy
思路:
此题采用贪心法。
贪心策略:
1. 先分给谁? 从得分最少的娃开始分,因此不妨构造child对象,对得分排序,以此存入child。
2. 分多少? 由于是按照得分从低到高分candy的。 如果邻居已经有人得了candy,那么就分别将当前娃的得分与左右两边娃进行对比:
a.如果当前得分与左或右相等,只给1个
b.如果当前得分大于左或右,需要给对方所得的candy数+1个
综合a,b,取最大的那个。
如果两边没人得candy,只给当前娃1个。
实现代码:
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?
就是给定1个rating数组,表示每个娃所得的评分。现在要求:
1.给每个娃至少分1个candy
2.分高的娃要比邻居所得的candy多
3.尽量少分candy
思路:
此题采用贪心法。
贪心策略:
1. 先分给谁? 从得分最少的娃开始分,因此不妨构造child对象,对得分排序,以此存入child。
2. 分多少? 由于是按照得分从低到高分candy的。 如果邻居已经有人得了candy,那么就分别将当前娃的得分与左右两边娃进行对比:
a.如果当前得分与左或右相等,只给1个
b.如果当前得分大于左或右,需要给对方所得的candy数+1个
综合a,b,取最大的那个。
如果两边没人得candy,只给当前娃1个。
实现代码:
class Child { public Child(int i , int v){ index = i; rating = v; } public int index; public int rating; } public int Candy(int[] ratings) { if(ratings == null || ratings.Length == 0){ return 0; } if(ratings.Length == 1){ return 1; } var arr = new List<Child>(); var candies = new int[ratings.Length]; for(var i = 0 ;i < ratings.Length; i++){ candies[i] = 0; arr.Add(new Child(i, ratings[i])); } arr = arr.OrderBy(x=>x.rating).ToList(); for(var i = 0 ;i < arr.Count ; i++){ var index = arr[i].index; if(candies[index] != 0){ continue; } if(index == 0){ candies[index] = ratings[index] == ratings[index + 1] ? 1 : candies[index + 1] + 1; } else if(index == candies.Length - 1){ candies[index] = ratings[index] == ratings[index - 1] ? 1 : candies[index - 1] + 1; } else{ var left = ratings[index-1] == ratings[index] ? 1 : candies[index - 1] + 1; var right = ratings[index+1] == ratings[index] ? 1 : candies[index + 1] + 1; candies[index] = Math.Max(left , right); } } var s = 0; for(var i = 0;i < candies.Length; i++){ s += candies[i]; } return s; }
相关文章推荐
- server 多线程
- 构建高可用linux服务器学习笔记
- 鼠标经过时改变DIV背景颜色的三种途径
- Android-基本控件(SeekBar 可拖动 滚动条的使用)
- SQL中的join操作总结(非常好)
- Java线性查找
- tcp/ip协议 卷一知识点整理
- Java Web学习路线
- mysql的常用操作
- 重建二叉树
- 计算屏幕大小
- 关于端口占用问题,利用tomcat发布工程,有时会出现由于端口被占用而发布不成功,就需要终止端口
- JS/JQ获取节点的同级,父级,子级元素
- 【python编程】python引导实例参考
- 详解js跨域问题
- 我不再一味相信书本上的知识,不再一味相信过去几二十多年对我的洗脑
- 异常
- 工作日志3
- 响应式设计的现状与趋势
- HDU 4081(次小生成树)