LeetCode 1742 题“盒子中小球的最大数量”要求你找到一个盒子中能放入的小球的最大数量。
题目描述如下:
- 给定两个整数
lowLimit
和highLimit
,它们表示小球的编号范围(从lowLimit
到highLimit
)。 - 每个小球都会放入一个盒子中,盒子根据小球编号的数字和来分配。
- 你需要计算哪一个盒子包含的小球数量最多,并返回这个最大数量。
解体关键知识点:如何计算一个整数各位上的数字的和,如321 =>3+2+1
// 迭代方式计算数字和
func cal(num int) int {
sum := 0
for num > 0 {
sum += num % 10
num /= 10
}
return sum
}
//递归方式
func cal(num int) int {
if num == 0 {
return 0
}
return num%10 + cal(num/10)
}
解题:
func countBalls(lowLimit int, highLimit int) int {
max := 0
mp := make(map[int]int)
for i := lowLimit; i <= highLimit; i++ {
sum := cal(i)
mp[sum]++
if max < mp[sum] {
max = mp[sum]
}
}
return max
}
// 迭代方式计算数字和
func cal(num int) int {
sum := 0
for num > 0 {
sum += num % 10
num /= 10
}
return sum
}
解释:
- 数字和计算:我们使用
ballCopy
来取出每个数字,并将其累加,直到ballCopy
变为 0。每次取出个位数使用% 10
,然后通过ballCopy /= 10
去掉最后一位。 - 哈希表:我们使用
map[int]int
来记录每个数字和对应的出现次数。 - 查找最大值:遍历
boxCount
中的值,找到出现最多小球的盒子。
时间复杂度:
- 对于每个小球,我们需要计算其数字和,时间复杂度是 O(d),其中 d 是小球的位数。因为每个编号最多有 6 位,时间复杂度是 O(n),其中 n 是小球的数量(
highLimit - lowLimit + 1
)。
示例:
对于 lowLimit = 1
和 highLimit = 10
,代码会输出 2
,因为数字和为 1
和 10
的小球数量最多,都是 2。