[美团]
链接:https://www.nowcoder.com/questionTerminal/76039109dd0b47e994c08d8319faa352
来源:牛客网

一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组arr代表得分数组,请返回最少需要多少糖果。
[要求]
时间复杂度为On, 空间复杂度为O1

示例1

输入

[1,1,2]

输出

4

说明

最优分配方案为1, 1,2

解答:正反序各来一次

  1. import java.util.*;
  2. public class Solution {
  3. /**
  4. * pick candy
  5. * @param arr int整型一维数组 the array
  6. * @return int整型
  7. */
  8. public int candy (int[] arr) {
  9. // write code here
  10. int sum = 0;
  11. if(arr ==null || arr.length == 0){
  12. return sum;
  13. }
  14. int length = arr.length;
  15. int[] res = new int[length];
  16. for(int i=0; i<length; i++){
  17. res[i] = 1;
  18. }
  19. for(int i=1; i<length; i++){
  20. if(arr[i] > arr[i-1]){
  21. res[i] = res[i-1] + 1;
  22. }
  23. }
  24. for(int i = length-2; i>=0; i--){
  25. if(arr[i] > arr[i+1]){
  26. res[i] = Math.max(res[i], res[i+1] +1);
  27. }
  28. }
  29. for(int i=0; i<length; i++){
  30. sum += res[i];
  31. }
  32. return sum;
  33. }
  34. }