您的位置:首页 > 其它

135. Candy

2017-03-12 01:31 155 查看
问题描述

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?

解决思路

总的来说就是一个贪心的策略,对于某一个点i,若i比左右点的都小,则i可以拿1颗糖,否则,需要比较它比左边的多少个数大,比右边的多少个数大,然后取两者较大的值,比如若i比左边3个数大,比右边2两个数大,则i最少都要拿4颗糖。(边界情况则只考虑一边)

代码

class Solution {
public:
int candy(vector<int>& ratings) {
if (!ratings.size())
return 0;
if (ratings.size() == 1)
return 1;
int count = 0,begin = 0;
while(ratings[begin] > ratings[begin+1] && begin+1 < ratings.size()){
++begin;
count += begin;
}
count += ++begin;
int cur = 1;
int len = ratings.size();
for (int i = begin; i < len;) {
if (ratings[i] > ratings[i-1] && i < len-1 && ratings[i] < ratings[i+1]) {
++cur;
count += cur;
++i;
} else if (ratings[i] > ratings[i-1]){
begin = 0;
while(ratings[begin+i] > ratings[begin+1+i] && begin+i+1 < ratings.size()){
++begin;
count += begin;
}
count += ++begin;
i = i+begin;
if (++cur > begin)
count += cur-begin;
cur = 1;
} else {
if (i == len -1 || ratings[i] <= ratings[i+1]) {
cur = 1;
count += cur;
++i;
} else {
begin =
4000
0;
while(ratings[begin+i] > ratings[begin+1+i] && begin+i+1 < ratings.size()){
++begin;
count += begin;
}
count += ++begin;
i = i+begin;
cur = 1;
}
}
}
return count;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: