candy(litecode动态规划)

来源:互联网 发布:pc手机淘宝链接转换 编辑:程序博客网 时间:2024/05/16 05:06

题目描述

  There are N children standing in a line. Each child is assigned a rating value.You are giving candies to these children subjected to the following requirements:    Each child must have at least one candy.    Children with a higher rating get more candies than their neighbors. What is the minimum candies you must give?

public class Solution {

public int candy(int[] ratings) {    int[] candies=new int[ratings.length];    for(int i=0;i<ratings.length;i++){        candies[i]=1;    }    candies=order(ratings,candies);    candies=reverse(ratings,candies);    return sum(candies);}public int[] order(int[] ratings,int[] candies){    int count=0;    for(int i=1;i<ratings.length;i++){        if(ratings[i]>ratings[i-1]) { count++; candies[i]+=count; }        else if(ratings[i]<=ratings[i-1]){ count=0;}    }    return candies;}public int[] reverse(int[] ratings,int[] candies){    int count=0;    for(int i=ratings.length-1;i>0;i--){        if(ratings[i-1]>ratings[i]) { count++; if(candies[i-1]>count) continue; candies[i-1]=count+1; }        else if(ratings[i-1]<=ratings[i]){ count=0;}    }    return candies;}public int sum(int[] candies){    int count=0;    for(int i=0;i<candies.length;i++){        count+=candies[i];    }    return count;}

}
/*
从前往后遍历的过程中,如果后面一个元素比前面的大,则在前面的基础上加1,如果后面的元素比前面的小,则让其等于1.
从后往前遍历和从前往后遍历的过程一样。
*/
注意的问题:
1、当出现两个数相等的时候,可以让后面一个数变为1,根据前面给的条件。
2、当两头遍历到中间某个最大值时,选择遍历结果的最大值。

0 0
原创粉丝点击