赞
踩
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到 1 个糖果。
- 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
思路:
源码:
public static int candy1(int[] ratings) { if(ratings==null||ratings.length==0){ return 0; } int N= ratings.length; int[] left=new int[N]; left[0]=1; for (int i = 1; i < N; i++) { if(ratings[i]>ratings[i-1]){ left[i]=left[i-1]+1; }else { left[i]=1; } } int[] right=new int[N]; right[N-1]=1; for (int i = N-2; i >=0; i--) { if(ratings[i]>ratings[i+1]){ right[i]= right[i+1]+1; }else { right[i]=1; } } int ans=0; for (int i = 0; i < N; i++) { ans+=Math.max(left[i],right[i] ); } return ans; }
在初阶的基础上加了一个要求:
- 相邻的孩子如果分数一样,得到的糖果数也必须一样
思路:
在初阶解题的基础上,加一个判断条件即可:
1.从前往后遍历时,如果[i]==[i-1],则i号的得到的糖果数和i-1一样
2.从后往前遍历时,如果[i]==[i+1],则i号的得到的糖果数和i+1一样
public static int candy2(int[] ratings) { if(ratings==null||ratings.length==0){ return 0; } int N= ratings.length; int[] left=new int[N]; left[0]=1; for (int i = 1; i < N; i++) { if(ratings[i]>ratings[i-1]){ left[i]=left[i-1]+1; }else if(ratings[i]==ratings[i-1]){ left[i]=left[i-1]; } else { left[i]=1; } } int[] right=new int[N]; right[N-1]=1; for (int i = N-2; i >=0; i--) { if(ratings[i]>ratings[i+1]){ right[i]= right[i+1]+1; }else if(ratings[i]==ratings[i-1]) { right[i] = right[i + 1]; }else { right[i]=1; } } int ans=0; for (int i = 0; i < N; i++) { ans+=Math.max(left[i],right[i] ); } return ans; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。