题目来源:牛客网
给从左至右排好队的小朋友们分糖果,
要求:
1.每个小朋友都有一个得分,任意两个相邻的小朋友,得分较高的所得的糖果必须大于得分较低的,相等则不作要求。
2.每个小朋友至少获得一个糖果。
求,至少需要的糖果数。
这个和分子弹本质上是一样的,根据士兵的成绩分配子弹,每个士兵至少分配一个子弹,相邻士兵成绩高的子弹个数一定要高于成绩差的返回要分配的子弹的最小个数
解题思路:
使用两个数组,分别从左到右和从右到左记录需要分配的个数,数组中每个位置的初始值都设置为1,比较时如果下一个比前面一个得分高,则设置后一个值为前一个值+1,以此类推。
代码实现
public class Candy {
public static void main(String[] args) {
int[] ratings = {2, 1,2};
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] numsStr = str.split(",");
int[] nums = new int[numsStr.length];
for (int i = 0; i < numsStr.length; i++) {
nums[i] = Integer.parseInt(numsStr[i]);
}
int result = bullitSolutionWith2Array(nums);
System.out.println(result);
}
public static int bullitSolutionWith2Array(int[] bullit) {
int sum = 0;
int[] left2right = new int[bullit.length];
int[] right2left = new int[bullit.length];
Arrays.fill(left2right, 1);
Arrays.fill(right2left, 1);
for (int i = 1; i < bullit.length; i++) {
if (bullit[i]>bullit[i-1]) {
left2right[i] = left2right[i-1]+1;
}
}
//从右到左比较时,结束条件是>=0
for (int length = bullit.length-2; length >= 0; length--) {
if (bullit[length]>bullit[length+1]){
right2left[length] = right2left[length+1] + 1;
}
}
for (int i = 0; i < bullit.length; i++) {
sum += Math.max(left2right[i], right2left[i]);
}
return sum;
}
}