leetcode 根据等级分糖果

根据等级分糖果

N 个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果:

(1) 每个孩子至少分得一颗糖果

(2) 权重较高的孩子,会比他的邻居获得更多的糖果。 总共最少需要多少颗糖果?

a. 编程实现

b. 分析给出算法的时间空间复杂度

Example 1:

Input: [1,0,2]

Output: 5

Example 2:

Input: [1,2,2]

Output: 4

a.

思路:设每个孩子分配到糖果的数组为candies,全部初始化为1,代表了没人至少分配到一颗糖。

先从左向右扫描数组,和前面的邻居比较,如果ratings[i] > ratings[i-1],则candies[i] = candies[i-1] + 1。

再从右向左扫描数组,和后面的邻居比较,如果ratings[i] > ratings[i+1],则candies[i]取candies[i]和candies[i+1]中的较大者。

最后对candies求和即可。

java代码如下(主函数和测试函数在Candy.java文件中):

public int find(int[] ratings) {

      int[] candies = new int[ratings.length];

      Arrays.fill(candies, 1);

     

      for(int i = 1; i < candies.length ; i++) {

          if(ratings[i] > ratings [i-1]) {

             candies[i] = candies[i-1] + 1;

          }

      }

     

      for(int i = candies.length - 2 ; i>=0 ;i--) {

          if(ratings[i] > ratings[i+1]) {

             candies[i] = Math.max(candies[i], candies[i+1] + 1);

          }

      }

     

      int sum = 0 ;

      for(int s : candies) {

          sum += s;

      }

      return sum;

   }

b.分析算法时间空间复杂度

分别从左向右和从右向左扫描candies数组,最后求和的时候再次扫描一遍candies数组,时间复杂度O(n);

使用一个candies数组存储数据,空间复杂度O(n)。

猜你喜欢

转载自blog.csdn.net/weixin_43821874/article/details/94737580