豆包MarsCode177 小C的糖果分配问题
问题描述
小C有一堆糖果,总共有颗。她需要将糖果分给小朋友们,每个小朋友的糖果数量必须在到之间。她想知道,在满足这些条件的前提下,最少可以分给多少个小朋友,最多可以分给多少个小朋友。如果糖果无法正好分完,返回-1。
测试样例
样例1:
输入:
n = 10, l = 2, r = 3输出:[4, 5]
样例2:
输入:
n = 7, l = 3, r = 5输出:[2, 2]
样例3:
输入:
n = 8, l = 1, r = 4输出:[2, 8]
解题步骤
-
最小小朋友数量:
- 最少的小朋友数量应该是将糖果
n除以最大糖果数r后向上取整,即。这是因为如果我们希望分给尽量少的小朋友,我们需要将糖果分配给每个小朋友最多的糖果数量r。
- 最少的小朋友数量应该是将糖果
-
最大小朋友数量:
- 为了最大化小朋友数量,应该是将糖果
n除以最小糖果数l后向下取整,即。这是因为如果我们希望分给尽量多的小朋友,我们需要将糖果分配给每个小朋友最少的糖果数量l。
- 为了最大化小朋友数量,应该是将糖果
-
判断是否能够正好分配糖果:
- 如果
min_friends * l > n,即使每个小朋友都分得最少的糖果数l,糖果也不够分,返回-1。如果max_friends * r < n,即使每个小朋友都分得最多的糖果数r,糖果也分不完,返回-1。
- 如果
代码实现
import java.util.Arrays;
public class Main {
public static int[] solution(int n, int l, int r) {
// 计算最小和最大小朋友数量
int minChildren = (int) Math.ceil((double) n / r);
int maxChildren = n / l;
// 如果无法分配糖果
if (minChildren * l > n || maxChildren * r < n) {
return new int[] {-1};
}
// 返回最小和最大小朋友数量
return new int[] { minChildren, maxChildren };
}
public static void main(String[] args) {
System.out.println(Arrays.equals(solution(10, 2, 3), new int[] { 4, 5 }));
System.out.println(Arrays.equals(solution(7, 3, 5), new int[] { 2, 2 }));
System.out.println(Arrays.equals(solution(8, 1, 4), new int[] { 2, 8 }));
}
}
代码解释
-
输入参数:
n:糖果的总数。l:每个小朋友糖果的最小数目。r:每个小朋友糖果的最大数目。
-
计算最小和最大小朋友数量:
minChildren通过Math.ceil((double)n / r)计算,表示最少小朋友数量。maxChildren通过n / l计算,表示最多小朋友数量。
-
判断是否能正好分配:
- 使用条件判断
minChildren * l > n || maxChildren * r < n来确认是否无法正好分配糖果,如果不能分配则返回-1。
- 使用条件判断
复杂度分析
- 时间复杂度:
O(1)。计算最小和最大小朋友数量,以及判断糖果是否能正好分配都是常数时间操作。 - 空间复杂度:
O(1)。只使用了常数空间来存储结果。