Leetcode5664. 放置盒子–贪心+二分
解题思路
我们通过观察法,可以看到如果要是底层堆放的正方形的面积尽可能的小,那么应让其尽可能的满足例2和例3满足的形式(贪心策略)。因此,我们可以考虑先按图中的形式迭代堆放。如果堆放到第i层总和正好满足所给方块数量,那么则第i层的数量即为答案,而如果到第i层总和大于所给方块的数量,我们可以先将方块堆放到第i-1层。然后,我们记录下当前还有多少方块需要堆积,我们再采用二分的方法寻找这i块方块要在最底层需要再放多少才可以满足题目要求(此时剩余的方块在往上层堆的时候满足差为1的等差数列)。
考虑细节
第i层在理论上恰好堆成题目要求数量的个数为(i+1)*i/2,同时我们也可以考虑通过迭代方法求出第i层数量(在代码中展示此方法)。
同时,我们若让第i层大于恰好的情况,那我们在最底层若增加k个方块那么总方块数在底层不在增加的情况下最大可以增加(k+1)*k/2。
代码实现
class Solution {
public int minimumBoxes(int n) {
//首先进行初始化
int step=1;
int num=0;
int sum=0;
//进行迭代
while(sum<n) {
num+=step;
sum+=num;
step++;
}
if(sum==n) return num; //恰好迭代满
//剩余方块数量
sum-=num;
sum=n-sum;
num-=(step-1); //返回上一层
//下面是一个等差数列求和
long low=1,high=sum;
while(low<high) {
long mid=(high+low)/2;
if((mid+1)*mid/2>sum) {
high=mid;
}
else if((mid+1)*mid/2<sum) {
low=mid+1;
}
else {
return (int)mid+num;
}
}
return (int)high+num;
}
}