一、题目解析
问题描述
小C有一堆糖果,总共有n颗。她需要将糖果分给小朋友们,每个小朋友的糖果数量必须在l到r之间。她想知道,在满足这些条件的前提下,最少可以分给多少个小朋友,最多可以分给多少个小朋友。如果糖果无法正好分完,返回-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]
问题分析
小C需要将总共n颗糖果分给小朋友,每个小朋友分得的糖果数量必须在[l, r]范围内。问题是要找到满足条件的最少和最多小朋友数量,且糖果必须正好分完。如果无法满足条件,返回-1。
解题思路
1、计算最少人数(min_friends)。假设每个小朋友都拿到最多的糖果r,最少人数的计算方法是将糖果总数n除以r并向上取整。
2、计算最多人数(max_friends)。假设每个小朋友都只拿到1颗糖果,最多人数就是将糖果总数n除以1并向下取整。
3、边界检查。如果最少人数大于最多人数则说明无法满足条件,直接返回-1。检查最少人数时,如果分配后总糖果数少于n则返回-1.检查最多人数时,如果分配后总糖果数多余n,也返回-1。
代码实现
import math
def solution(n: int, l: int, r: int) -> list:
# 最少小朋友数
min_friends = math.ceil(n / r)
# 最大小朋友数
max_friends = n // l
if min_friends>max_friends:
return [-1]
if min_friends * r < n or max_friends * l > n:
return [-1]
return [min_friends, max_friends]
二、知识总结
·math.ceil()用于向上取整,将小数部分向上进位到整数;// 用于向下取整。
·最优化思想:在计算最小人数时尽量让每个小朋友分多,在计算最多人数时尽量让每个小朋友分少。
三、学习计划
对于错题的使用,我们可以记录并分析错误的类型,然后重新审视题目,确保理解所有的要求之后从零开始重新写代码,以防止陷入原有错误的思维惯性。
四、工具使用
可以利用豆包中的AI给出的提示进行代码的编写,能提供一定的灵感。还可以利用网上已有的学习资源进行算法的学习。