Leetcode5664. 放置盒子--贪心+二分

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值