【二分枚举答案】【二维网格】【2023-12-24】
思路
通过如下过程,我们可以求出边长为 2n
时,二维网格可以容纳的苹果数量为:
2 n ( n + 1 ) ( 2 n + 1 ) 2n(n+1)(2n+1) 2n(n+1)(2n+1)
图片来源 【图解】O(1) 做法(Python/Java/C++/Go/JS/Rust)。
随着边长的增大,二维网格可以容纳的苹果数量也在增大。于是我们可以二分枚举二维网格的边长,找出可以容纳 neededApples
个苹果的最小二维网格边长。
二分边界为 [1, 100000]
,其中 100000
是根据边长为 2n
的二维网格可以容纳苹果 2n(n+1)(2n+1)
估算得到。
算法
#define ll long long
class Solution {
public:
long long minimumPerimeter(long long neededApples) {
int l = 1, r = 100000;
int ans = 0;
while(l <= r){
int mid = (l + r) >> 1;
if((ll) 2*mid*(mid+1)*(2*mid+1) >= neededApples){
ans = mid;
r = mid - 1;
}
else{
l = mid + 1;
}
}
return ans * 8;
}
};
复杂度分析
时间复杂度: O ( l o g m ) O(logm) O(logm), m = n e e d e d A p p l e s 3 m = \sqrt[3]{neededApples} m=3neededApples?。
空间复杂度: O ( 1 ) O(1) O(1)。
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。