LeetCode 1954. 收集足够苹果的最小花园周长
2023-12-24 15:29:56
一、题目
1、题目描述
给你一个用无限二维网格表示的花园,每一个?整数坐标处都有一棵苹果树。整数坐标?
(i, j)
?处的苹果树有?|i| + |j|
?个苹果。你将会买下正中心坐标是?
(0, 0)
?的一块?正方形土地?,且每条边都与两条坐标轴之一平行。给你一个整数?
neededApples
?,请你返回土地的?最小周长?,使得?至少?有?neededApples
?个苹果在土地?里面或者边缘上。
|x|
?的值定义为:
- 如果?
x >= 0
?,那么值为?x
- 如果?
x <?0
?,那么值为?-x
2、接口描述
class Solution {
public:
long long minimumPerimeter(long long neededApples) {
}
};
3、原题链接
二、解题报告
1、思路分析
每个位置是|i| + |j|个苹果,而且限制区域为以原点为中心的正方形,那么一定是有数学规律的。
其实可以分为四个数目相等的区域,为什么呢?
可以由|x| + |y| = k的函数图像得知,也可以观察发现
我们只需要计算出一个区域内的值然后乘4即可
我们设边长2n(由于以原点为中心,所以边长为偶数)
那么对于一个区域来说有n行n+1列
第一行为(n+1) * n / 2,每一行都比前一行多n,显然是首项为(n+1) * n / 2公差为n的等差数列
我们求得一个区域的总数然后乘4即可
sum = 4*n^3 + 6*n^2 + 2*n?
2、复杂度
由于log(1000000)大概也就20上下,所以时间复杂度为O(1)
时间复杂度: O(1) 空间复杂度:O(1)
3、代码详解
?
class Solution {
public:
long long minimumPerimeter(long long neededApples) {
long long l = 1 , r = 1000000 , s = 0 , mid = 0;
while(l < r)
{
mid = (l + r) >> 1;
s = (4*mid*mid*mid + 6*mid*mid + 2*mid);
if(s >= neededApples) r = mid;
else l = mid + 1;
}
return r << 3;
}
};
文章来源:https://blog.csdn.net/EQUINOX1/article/details/135181869
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!