本页目录

LeetCode 1739.放置盒子

原题链接:放置盒子

数学找规律题目,我推出了的函数,表示最下层有个盒子时,最大的可能总盒子数。然而题目是想反求,因此可以使用二分。

二分的复杂度为级别,有更优雅的整体复杂度为常数的数学解法,可以参考官方题解。

不过,我们可以考虑使用不精确的数学方法优化二分的初始区间,考虑对进行放缩。

推导过程就省略了,然后反解得到:

这是对区间右端的近似。同样对于区间左端,可以在足够大时保证:

这里对常数的选取是较为随意的。经过这个优化可以把二分区间压缩到非常小的范围。

class Solution {
public:
    int f(int i)
    {
        int a=-0.5+sqrt(1+8*i)/2;
        int b=i-a*(a+1)/2+1;
        int c=b*(b+1)/2;
        return (long long)a*(a+1)*(a+2)/6+c;
    }
    int minimumBoxes(int n) {
        //int l=0,r=pow(2.13*n,2.0/3);
        int l=n<500?0:pow(2*n,2.0/3),r=pow(2.13*n,2.0/3);//更紧的约束
        while(l+1<r)
        {
            int mid=l+(r-l)/2;
            if(f(mid-1)>=n) r=mid;
            else l=mid;
        }
        return r;
    }
};