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或者单调递减2或者都相同的序列3
case 1: 单调递增的第一个人的个数肯定是最小的,即1,因为在此序列之前,只能是单调递减或者是都相同的序列,因此第一个人的个数是1,后面递增
case 2: 单调递减的最后一个人肯定是最小的,即1,然后向前依次递增。到了最前面,即最大值以后,根据递增的大小和当前最前面目前的最大值来更新。
case 3:值都相同的一个序列 1 3 3 3 3 根据题意,其所对应的count值为1 2 1 1 1,即保证头尾的大小,中间的值均为最小值即可。
代码比较丑陋。。。这次WA了两次,第一次在count的初始化上,应该都初始化为1;第二次在for loop上面,我忘记把for括号里的i++拿掉了,因为i已经在for的大循环体中更新了自己的值,所以不需要再i++了。
class Solution {
public:
int candy(vector<int> &ratings) {
vector<int> count;
for(int i=0;i<ratings.size();i++){
count.push_back(1);
}
for(int i=0;i<ratings.size();){
int k = i+1;
if(k>=ratings.size())
break;
bool equal = false;
while(k<ratings.size() && ratings[k]==ratings[k-1]){
k++;
equal = true;
}
if(equal){
for(int j=i+1;j<k;j++)
count[j] = 1;
i = k-1;
continue;
}
bool big = false;
while(k<ratings.size() && ratings[k]>ratings[k-1]){
big = true;
k++;
}
if(!big){
while(k<ratings.size() && ratings[k]<ratings[k-1]){
k++;
}
}
if(big){
for(int j=i;j<k;j++)
count[j] = j-i+1;
}else{
for(int j=k-1;j>i;j--)
count[j] = k-j;
count[i] = max(count[i],k-i);
}
i = k-1;
}
int sum = 0;
for(int i=0;i<count.size();i++)
sum+=count[i];
return sum;
}
};
======================================Modified on 5th, April, 2014================================
class Solution {
public:
int candy(vector<int> &ratings) {
vector<int> can;
for(int i=0;i<ratings.size();i++)
can.push_back(1);
for(int i=0;i<ratings.size()-1;){
int k = i+1;
if(ratings[k]==ratings[i]){
while(k<ratings.size() && ratings[k]==ratings[i])
k++;
can[i] = max(can[i],1);
}else if(ratings[k]>ratings[i]){
while(k<ratings.size() && ratings[k]>ratings[k-1])
k++;
for(int j=i;j<k;j++)
can[j] = j-i+1;
}else{
while(k<ratings.size() && ratings[k]<ratings[k-1])
k++;
for(int j=k-1;j>i;j--)
can[j] = k-j;
can[i] = max(can[i],k-i);
}
i = k-1;
}
int total = 0;
for(int i=0;i<can.size();i++)
total+=can[i];
return total;
}
};
这下代码就工整的多了!
======================================Modified on 5th, April, 2014================================