1
+ /*
2
+ Author: King, wangjingui@outlook.com
3
+ Date: Dec 12, 2014
4
+ Problem: Candy
5
+ Difficulty: Easy
6
+ Source: https://oj.leetcode.com/problems/candy/
7
+ Notes:
8
+ There are N children standing in a line. Each child is assigned a rating value.
9
+ You are giving candies to these children subjected to the following requirements:
10
+ - Each child must have at least one candy.
11
+ - Children with a higher rating get more candies than their neighbors.
12
+ What is the minimum candies you must give?
13
+
14
+ Solution: You may refer to https://github.com/AnnieKim/ITint5/blob/master/031_%E5%88%86%E9%85%8D%E7%B3%96%E6%9E%9C.cpp
15
+ 1. O(n) space.
16
+ 2. traverse only once with O(1) space.
17
+ */
18
+
19
+ public class Solution {
20
+ public int candy (int []ratings ) {
21
+ return candy_1 (ratings );
22
+ }
23
+ public int candy_1 (int []ratings ) {
24
+ int N =ratings .length ;
25
+ if (N ==0 )return 0 ;
26
+ int []height =new int [N ];
27
+ int res =0 ;
28
+ height [0 ] =1 ;
29
+ for (int i =1 ;i <N ; ++i ) {
30
+ height [i ] =1 ;
31
+ if (ratings [i ] >ratings [i -1 ]) {
32
+ height [i ] =height [i -1 ] +1 ;
33
+ }
34
+ }
35
+ for (int i =N -2 ;i >=0 ; --i ) {
36
+ if (ratings [i ] >ratings [i +1 ]) {
37
+ height [i ] =Math .max (height [i ],height [i +1 ] +1 );
38
+ }
39
+ }
40
+ for (int i =0 ;i <N ; ++i ) {
41
+ res +=height [i ];
42
+ }
43
+ return res ;
44
+ }
45
+ public int candy_2 (int []ratings ) {
46
+ int N =ratings .length ;
47
+ if (N ==0 )return 0 ;
48
+ int candy =1 ,res =1 ;
49
+ int maxVal =1 ,maxIdx =0 ;
50
+ for (int i =1 ;i <N ; ++i ) {
51
+ if (ratings [i ] >=ratings [i -1 ]) {
52
+ candy =ratings [i ] ==ratings [i -1 ] ?1 :candy +1 ;
53
+ maxVal =candy ;
54
+ maxIdx =i ;
55
+ }else {
56
+ if (candy ==1 ) {
57
+ if (maxVal <=i -maxIdx ) {
58
+ ++maxVal ;
59
+ ++res ;
60
+ }
61
+ res +=i -maxIdx -1 ;
62
+ }
63
+ candy =1 ;
64
+ }
65
+ res +=candy ;
66
+ }
67
+ return res ;
68
+ }
69
+ }