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

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=0right=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
  • 代码简洁高效,满足大数据量的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值