题目链接

题目大意:分糖果,每个小朋友都有一个ratings值,且每个小朋友至少都要有一个糖果,而且每个小朋友的ratings值如果比左右邻舍的小朋友的ratings值高,则其糖果数量也比邻舍的小朋友多。

法一:超时。按照要求,从前往后比较每个小朋友的ratings值,如果后一个小朋友的ratings值比前一个大,则更新小朋友糖果值dp[i]=dp[i-1]+1;否则,将当前小朋友的糖果值置1,然后考察其前一个小朋友糖果值是否满足dp[i-1]<=dp[i],且ratings[i-1]>ratings[i],如果满足这两个条件,则说明前小朋友的糖果值需要更新,且需要循环遍历更新前面小朋友的糖果值。o(n^2)。代码如下:

 1     public int candy(int[] ratings) {
 2         int len = ratings.length;
 3         if(len == 0) {
 4             return 0;
 5         }
 6         else if(len == 1) {
 7             return 1;
 8         }
 9         int[] dp = new int[len];
10         //初始化第一个小伙伴的糖果值
11         dp[0] = ratings[0] <= ratings[1] ? 1 : 2;
12         int cnt = 0;
13         for(int i = 1; i < len; i++) {
14             //只与前面小伙伴的ratings进行比较
15             if(ratings[i] > ratings[i - 1]) {
16                 dp[i] = dp[i - 1] + 1;
17             }
18             else {
19                 dp[i] = 1;
20                 //如果前面小伙伴的糖果是1,且ratings比较高,则遍历其前面的所有小伙伴
21                 if(dp[i - 1] == 1 && ratings[i - 1] > ratings[i]) {
22                     //更新前面的小伙伴的糖果值,因为这个更新,对于这种用例5,3,1,这个小伙伴前面的所有糖果值都要更新,所以进入下面的for循环进行判断
23                     dp[i - 1] = 2;
24                     for(int j = i - 2; j >= 0; j--) {
25                         //如果前面的小伙伴的糖果值小,且ratings又比较高,则更新其值
26                         if(ratings[j] > ratings[j + 1] && dp[j] <= dp[j + 1]) {
27                             dp[j] = dp[j + 1] + 1;
28                         }
29                         else {
30                             break;
31                         }
32                     }
33                 }
34             }
35         }
36         //计算所有的糖果值
37         for(int i = 0; i < len; i++) {
38             cnt += dp[i];
39         }
40         return cnt;
41     }
View Code

相关文章: