收集足够苹果的最小花园周长

标签: 数学 二分查找

难度: Medium

给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| + |j| 个苹果。

你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。

给你一个整数 neededApples ,请你返回土地的 最小周长 ,使得 至少 有 neededApples 个苹果在土地 里面或者边缘上

|x| 的值定义为:

  • 如果 x >= 0 ,那么值为 x
  • 如果 x < 0 ,那么值为 -x

示例 1:

输入:neededApples = 1
输出:8
解释:边长长度为 1 的正方形不包含任何苹果。
但是边长为 2 的正方形包含 12 个苹果(如上图所示)。
周长为 2 * 4 = 8 。

示例 2:

输入:neededApples = 13
输出:16

示例 3:

输入:neededApples = 1000000000
输出:5040

提示:

  • 1 <= neededApples <= 1015

Submission

运行时间: 36 ms

内存: 15.9 MB

class Solution:
    def minimumPerimeter(self, neededApples: int) -> int:
        l, r = 1, 100000
        while l < r:
            mid = (l + r) >> 1
            if 2 * mid * (mid + 1) * (2 * mid + 1) >= neededApples:
                r = mid
            else:
                l = mid + 1
        return l * 8

Explain

此题解采用二分查找的方式确定最小的正方形边长,使其包含的苹果总数至少为neededApples。首先,设置两个指针l和r分别代表可能的正方形边长的下限和上限。通过迭代的方式,我们计算每一个中间值mid所代表的正方形边长能够包含的苹果数量,这是通过特定的公式计算得出的。如果这个数量满足所需的苹果数量neededApples,我们则尝试减小正方形的边长(通过调整r);反之,我们增大边长(调整l)。这个迭代过程一直进行到l和r相遇,此时,l(或r)即为所求的最小边长,而最小周长为这个边长的四倍乘以2。

时间复杂度: O(log(maxL))

空间复杂度: O(1)

class Solution:
    def minimumPerimeter(self, neededApples: int) -> int:
        l, r = 1, 100000 # 初始化左右边界
        while l < r: # 当左边界小于右边界时执行循环
            mid = (l + r) >> 1 # 计算中间值
            # 计算中间值边长的正方形中包含的苹果数,使用给定公式
            if 2 * mid * (mid + 1) * (2 * mid + 1) >= neededApples:
                r = mid # 如果中间值满足条件,尝试减小边长
            else:
                l = mid + 1 # 否则增大边长
        return l * 8 # 返回最小周长,边长的四倍乘以2

Explore

100000作为正方形边长的上限是一个经验或估计值,用于确保覆盖到足够大的范围以找到解决问题所需的最小边长。这个数字的确定通常基于问题的需求和可能的输入范围,以及通过预先的计算或测试来验证这个上限是否足够大,能够确保找到一个满足条件的边长。在实际应用中,这个值可能需要根据具体问题的数据范围进行调整。

题解中使用的公式`2 * mid * (mid + 1) * (2 * mid + 1)`计算的是一个围绕原点对称分布的正方形区域内的苹果数量。这个公式来源于数学推导,其中`mid`表示正方形边长的一半,苹果的分布可能与距离中心的距离有关,公式的每一部分可能代表不同方向上的增长率或某种形式的数学累加。详细的公式解释可能需要具体的数学背景知识,通常是基于几何序列或组合数学的计算。

二分查找的迭代次数通常可通过计算`log2(n)`得出,其中`n`是搜索范围的大小。在本题中,若初始范围为1到100000,迭代次数大约为`log2(100000)`。计算`log2(100000)`大约为16.6,这表示在最坏情况下,我们需要约16.6步来从最大范围缩小到1,每步迭代都将搜索区间减半。

这个条件中的公式用于估计给定边长`mid`时,正方形内可以收集到的苹果总数。选择这种形式的原因是基于问题的特定背景和苹果分布的模型,其中可能考虑了正方形的对称性和几何增长特性。当计算出的苹果数量大于或等于所需数量`neededApples`时,说明当前的边长`mid`是足够的,因此可以尝试减小边长以寻找更小的满足条件的边长。这是二分查找策略中用于优化解的关键步骤。