Candy

来源:互联网 发布:js option 选中 编辑:程序博客网 时间:2024/05/18 03:58

1.问题描述:
给N个小朋友发糖果,需要保证每个小朋友至少一个糖果,以及权重大的小朋友比其邻居要多,最优问题是在满足上述条件下,给N个小朋友发的糖果总数最少
2.解题思想:
1)边界考虑,若ratings的数量为0,则返回0(0个人则不需要发糖果)
2)动态规划:
2.1)最优子问题:假设每个人的初始糖果数都为1个,即count[]的每个元素为1,从前向后发糖果需保证若ratings[i-1]<ratings[i],count[i]=count[i-1]+1,之后从后向前发,若ratings[i-1]>ratings[i]&&count[i-1]<=count[i],则count[i-1]=count[i]+1
2.2)递归表示最优子结构
2.3)自顶向下求最优解,即将count[0~n-1]的值累加即为最少分配的糖果数
3.程序源码
import java.util.*;
public class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        if(n==0 || ratings == null)
            return 0;
        int[] count = new int[n];
        int sum=0;
        //初始,每个孩子至少有一颗糖
        Arrays.fill(count, 1); 
        for(int i=1; i<n; i++){
            if(ratings[i] > ratings[i-1]){
                count[i] = count[i-1]+1;
            }
        }
        for(int i=n-1; i>0; i--){
            if(ratings[i]<ratings[i-1] && count[i]>=count[i-1]){
                count[i-1] = count[i]+1;
            }
            sum += count[i];
        }
        sum += count[0];
        return sum;
         
    }  
}

原创粉丝点击