力扣第1742题——盒子中小球的最大数量

针对力扣计数小球问题,通过分析数据范围,采用数组替代哈希表进行优化,实现高效求解放有最多小球的盒子中小球的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 题目如下:

你在一家生产小球的玩具厂工作,有 n 个小球,编号从 lowLimit 开始,到 highLimit 结束(包括 lowLimit 和 highLimit ,即 n == highLimit - lowLimit + 1)。另有无限数量的盒子,编号从 1 到 infinity 。

你的工作是将每个小球放入盒子中,其中盒子的编号应当等于小球编号上每位数字的和。例如,编号 321 的小球应当放入编号 3 + 2 + 1 = 6 的盒子,而编号 10 的小球应当放入编号 1 + 0 = 1 的盒子。

给你两个整数 lowLimit 和 highLimit ,返回放有最多小球的盒子中的小球数量。如果有多个盒子都满足放有最多小球,只需返回其中任一盒子的小球数量。

1 <= lowLimit <= highLimit <= 10^5

这道题力扣官方给的题解是用哈希表来暴力求解,但是我在看完数据范围后,有了一点小想法,能不能不用哈希表,就只是用数组来解答呢。答案是可以的。我的思路如下:

由于这道题规定了highLimit最大值是十的五次方,所以我们要使用的最大的盒子编号就是第99999号小球要放入的盒子的编号,即45,因此我们可以创建一个长度为46的数组(因为编号是从1号开始的),代表着这些盒子。如此一来的话,每次都可以求出这个小球应该放入哪个盒子,然后让对应的盒子加一就可以了。

var countBalls = function(lowLimit, highLimit) {
    let ret = new Array(46).fill(0);
    let num,sum;
    for(let i=lowLimit;i<=highLimit;i++){
        num = i;
        sum = 0;
        while(num!=0){
            sum = sum+num%10;
            num = (num - num%10)/10;
        }
        ret[sum]++;
    }
    return Math.max(...ret);
};

提交后结果如下

可以看见,虽然也是暴力解法,但是由于数据范围限制,结果还是很不错的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值