leetcandy
来源:互联网 发布:手机放大镜软件 编辑:程序博客网 时间:2024/06/05 13:13
题目大概意思就是给你一些孩子的rating,这些孩子站成一个直线,相邻的孩子rating高的一定要比rating低的孩子的candy多
所有孩子至少有一个candy。
问最少发多少个candy(好抠)
最少呢,我们当然就是保证再满足限制条件下尽量少发candy给孩子。
那限制条件当然来自相邻的孩子。
如果我比你高,我就比你多1,最低的孩子为1.
从左往右扫瞄一次,波谷为1,然后依次加1到波峰,再到波谷时又是1
这样就满足所有rating高的比左边rating低的孩子的candy多了。
然后再从右往左来一次,一样的,不弱还要多个条件就是,因为刚才算了一次candy[i]了
这次candy[i]要取最大的才能同同时满足这两个条件。
然后就ok啦,两边都满足了!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class
Solution {
public
:
int
candy(vector<
int
> &ratings) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int
cap = ratings.size();
int
* candy =
new
int
[cap];
fill(candy , candy + cap , 0);
int
k = 1;
for
(
int
i = 1 ; i < cap ; i++){
if
(ratings[i] > ratings[i - 1]){
candy[i] = max(k++ , candy[i]);
}
else
{
k = 1;
}
}
k = 1;
for
(
int
i = cap -2 ; i >= 0 ; i --){
if
(ratings[i] > ratings[i + 1]){
candy[i] = max(k++ , candy[i]);
}
else
{
k = 1;
}
}
int
ans = cap;
for
(
int
i = 0 ; i < cap ; i++) ans += candy[i];
return
ans;
}
};
0 0