您的位置:首页 > 其它

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

实现:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: