有一个立方体房间,其长度、宽度和高度都等于
n
个单位。请你在房间里放置n
个盒子,每个盒子都是一个单位边长的立方体。放置规则如下:
- 你可以把盒子放在地板上的任何地方。
- 如果盒子
x
需要放置在盒子y
的顶部,那么盒子y
竖直的四个侧面都 必须 与另一个盒子或墙相邻。给你一个整数
n
,返回接触地面的盒子的 最少 可能数量*。*
只能找找规律 求和肯定算不出来
思路:
实现
class Solution {public int minimumBoxes(int n) {int i = 1, cur = 1;while (cur < n){n -= cur;i++;cur += i;}int j = 1;while (n - j > 0 ){n -= j;j++;}return i * (i - 1) / 2 + j;}
}
思路:使用二分查找法搜索需要放置至第iii层(前i−1i-1i−1层铺满),还需要放置jjj个盒子至地面才可以放置nnn个盒子
在第iii层放jjj个放置地面的盒子,所增加的盒子总数为
f(j)=j∗(j+1)2j≤if(j)= \frac{j*(j+1)}{2}\\ j \le i f(j)=2j∗(j+1)j≤i
放满前iii层的盒子总数为
g(i)=∑n=1if(n)=12∑n=1i(n2+n)=12∑n=1i[n∗(n+1)∗(2n+1)6+n(n+1)2]=∑n=1in∗(n+1)∗(n+2)6g(i) = \sum_{n=1} ^if(n)=\frac{1}{2}\sum_{n=1} ^i(n^2+n)\\ = \frac{1}{2}\sum_{n=1} ^i[\frac{n*(n+1)*(2n+1)}{6}+\frac{n(n+1)}{2}]\\ =\sum_{n=1} ^i\frac{n*(n+1)*(n+2)}{6} g(i)=n=1∑if(n)=21n=1∑i(n2+n)=21n=1∑i[6n∗(n+1)∗(2n+1)+2n(n+1)]=n=1∑i6n∗(n+1)∗(n+2)
以上两个函数均具有单调性,因此可以使用二分查找进行查找
实现
class Solution {public int minimumBoxes(int n) {int i = 0, j = 0;int low = 1, high = Math.min(n, 100000);while (low < high) {int mid = (low + high) >> 1;long sum = (long) mid * (mid + 1) * (mid + 2) / 6;if (sum >= n) {high = mid;} else {low = mid + 1;}}i = low;n -= (long) (i - 1) * i * (i + 1) / 6;low = 1;high = i;while (low < high) {int mid = (low + high) >> 1;long sum = (long) mid * (mid + 1) / 2;if (sum >= n) {high = mid;} else {low = mid + 1;}}j = low;return (i - 1) * i / 2 + j;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/building-boxes/solutions/2030450/fang-zhi-he-zi-by-leetcode-solution-7ah2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。