Candy
2016-05-07 14:20
190 查看
【题目】
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?
【题意】
多个小朋友站成一排,根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?
【解析】
初始化数组dp,数组成员均为1 ,每个孩子先分配一个糖果
从左向右遍历,如果第i个孩子比第i - 1孩子等级高,则dp[i] = dp[i - 1] + 1
从右向左遍历,如果第i个孩子比第i + 1孩子等级高并且糖果比i+1糖果少,则dp[i] = dp[i + 1] + 1
实现:
[/code]
二:参考别人:
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?
【题意】
多个小朋友站成一排,根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?
【解析】
初始化数组dp,数组成员均为1 ,每个孩子先分配一个糖果
从左向右遍历,如果第i个孩子比第i - 1孩子等级高,则dp[i] = dp[i - 1] + 1
从右向左遍历,如果第i个孩子比第i + 1孩子等级高并且糖果比i+1糖果少,则dp[i] = dp[i + 1] + 1
实现:
public class Solution { public int candy(int[] ratings) { if (ratings == null || ratings.length == 0) { return 0; } ArrayList<Integer> dp = new ArrayList<Integer>(); for (int i = 0; i < ratings.length; i++) { dp.add(i, 1); } for (int i = 1; i < ratings.length; i++) { if (ratings[i] > ratings[i - 1]) { dp.set(i, dp.get(i - 1) + 1); } } for (int i = ratings.length - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1] && dp.get(i) <= dp.get(i + 1)) { dp.set(i, dp.get(i + 1) + 1); } } int res = 0; for (int i = 0; i < dp.size(); i++) { res += dp.get(i); } return res; } }
[/code]
二:参考别人:
public class Solution { public int candy(int[] ratings) { int size = ratings.length; if (size == 0) return -1; if (size == 1) return 1; int[] cans = new int[size]; cans[0] = 1; //正向扫描一遍,如果右边的rating比左边高,那么右边的糖果数就比左边多一个,否则只给一个糖果 for (int i = 1; i < size; i++) { if (ratings[i] > ratings[i - 1]) cans[i] = cans[i - 1] + 1; else cans[i] = 1; } //反向扫描一遍,如果左边的rating比右边高,并且左边的糖果数比右边少,那么左边的糖果数应比右边多一 for (int i = size - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) { cans[i] = cans[i + 1] + 1; } } int ret = 0; for (int i = 0; i < size; i++) { ret += cans[i]; } return ret; } }
相关文章推荐
- HDU 2048 神、上帝以及老天爷(DP+错序排+组合数学)
- 第十周第十一周阅读程序-5-e
- 自己的第一次容斥原理的实践(还有等差数列求和)终于会做数学题了
- python write( )函数
- response.sendRedirect()与request.getRequestDispatcher().forward(request,response)
- jQuery环境搭建
- [知其然不知其所以然-23] Something about the printk loglevel and var_list
- SqlHelper
- linux下简单socket网络编程
- 抛砖引玉,扒扒伪基站那些事(转)
- 欢迎使用CSDN-markdown编辑器
- solr-5.4.1 和 mmseg4j-2.3.0版本的配置
- 游戏底层逻辑,空间划分
- HDU 4871 Shortest-path tree
- IT十八掌掌三天课程总结
- eclipse中 maven 环境搭建
- WebService 之 WSDL文件 讲解
- arm移植php
- Metal 着色语言编程指南 十八
- xshow-2. 使用HTML 5 Boilerplate构建前端