candy(litecode动态规划)

题目描述

  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值