LeetCode 1954 | 苹果的最小周长花园 —— 数学与二分查找的完美结合
题目描述
你有一个无限大的二维网格花园,每个整数坐标 (i, j)
处都有一棵苹果树。该位置的苹果树结有 |i| + |j|
个苹果,其中 |x|
表示 x
的绝对值。
你打算购买一块以 (0,0)
为中心的正方形土地,且正方形的每条边都平行于坐标轴。
给定一个整数 neededApples
,表示你希望在这块土地中(包括边缘)至少采集到这么多苹果。请返回这块土地最小的周长。
绝对值定义:
- 若
x >= 0
,则|x| = x
- 若
x < 0
,则|x| = -x
题目示例
- 示例 1:
输入:neededApples = 1
输出:8
解释:边长为 1(即范围 [-0.5,0.5]
)的正方形不包含任何整数坐标点,边长为 2(即范围 [-1,1]
)的正方形内有12个苹果,满足需求。周长为 2 * 4 = 8
。
- 示例 2:
输入:neededApples = 13
输出:16
- 示例 3:
输入:neededApples = 1000000000
输出:5040
解题分析
这是一个数学求和与二分查找结合的题目。
1. 正方形的范围和周长
- 正方形中心固定在
(0, 0)
。
假设正方形边长为 2n
,则正方形的范围是:
- $ x \in [-n, n], \quad y \in [-n, n] $
周长为:
- 4×边长=4×2n=8n
2. 计算正方形内苹果数
对于正方形内所有坐标 (i, j)
,苹果数总和是:
$ \sum_{i=-n}^n \sum_{j=-n}^n (|i| + |j|) $
拆开求和:
$ = \sum_{i=-n}^n \sum_{j=-n}^n |i| + \sum_{i=-n}^n \sum_{j=-n}^n |j| = (2n+1) \sum_{i=-n}^n |i| + (2n+1) \sum_{j=-n}^n |j| $
因为对称性:
$ \sum_{i=-n}^n |i| = 2 \sum_{k=1}^n k = n(n+1) $
因此:
苹果总数=2(2n+1)n(n+1)
3. 问题转化为数学不等式
我们需要找最小的正整数 n
满足:
$ 2 (2n + 1) n (n + 1) \geq neededApples $
4. 解法策略:二分查找
- 由于
n
单调增加时,苹果总数单调增加,可以用二分法高效求解。 - 设定二分边界,例如
left=0
,right=10^7
(或更大),直到找到最小满足条件的n
。
解题代码(Python)
class Solution:
def minimumPerimeter(self, neededApples: int) -> int:
left, right = 0, 10**7 # 较大的上界
while left < right:
mid = (left + right) // 2
apples = 2 * (2 * mid + 1) * mid * (mid + 1)
if apples >= neededApples:
right = mid
else:
left = mid + 1
return 8 * left
代码解析
apples
通过数学公式计算对应正方形内苹果总数,无需遍历所有点,时间复杂度为 O(1)。- 利用二分查找找到最小
n
,使得苹果数满足要求,时间复杂度 O(log N)。 - 最后返回周长
8 * n
。
示例验证
neededApples = 1
- 当
n=0
,苹果数=0,不满足。 - 当
n=1
,苹果数=12,满足,周长=8。
- 当
neededApples = 13
n=1
,苹果数=12,不满足。n=2
,苹果数=60,满足,周长=16。
neededApples = 1000000000
- 代码运行结果:5040。
方法优缺点分析和比较
方法 | 时间复杂度 | 空间复杂度 | 说明 |
---|---|---|---|
直接遍历 | O(n²) | O(1) | 会超时,网格无限大 |
数学公式计算 | O(1) | O(1) | 快速计算任意边长的苹果数 |
二分查找 + 数学 | O(log N) | O(1) | 结合数学计算,效率最高 |
总结
- 本题巧妙利用了对称性和数学公式,将问题从遍历无限点的暴力计算,转化为数学表达式计算。
- 利用单调性应用二分查找,快速找到满足条件的最小边长
n
。 - 代码简洁高效,满足大数据量的需求。