1. 问题重述与理解
LeetCode 3453题"分割正方形I"要求我们找到一个水平分割线,使得这条线以上所有正方形的总面积等于线以下所有正方形的总面积。题目给出了几个关键条件:
- 每个正方形由左下角坐标(xi, yi)和边长li表示
- 正方形可能与x轴平行(即边与坐标轴对齐)
- 正方形之间可能存在重叠,重叠区域需要多次计算
- 答案允许有10^-5的误差范围
这个问题本质上是在寻找一个y坐标值,使得所有正方形在这个y值以上的面积总和等于在y值以下的面积总和。由于正方形可能重叠,计算时需要特别注意重叠区域的处理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 暴力解法的问题
最直观的解法可能是遍历所有可能的y值,计算每个y值对应的上下面积,直到找到满足条件的y值。然而,这种方法存在几个问题:
- y的取值范围可能非常大(题目中提示0 <= yi <= 10^9)
- 需要极高的精度(误差不超过10^-5)
- 对于每个y值,都需要遍历所有正方形计算面积,时间复杂度为O(n)
因此,暴力解法在最坏情况下时间复杂度可能达到O(n*10^9),显然不可行。
2.2 二分查找的优势
二分查找是解决这类"在有序范围内寻找特定值"问题的理想选择。在这个问题中:
- y值的范围是有序的(从最小y到最大y+边长)
- 我们可以定义"y值是否足够大"的判断条件(即上面积是否大于总面积的一半)
- 二分查找可以将时间复杂度从O(n)降低到O(log n)
具体来说,我们可以:
- 先计算所有正方形的总面积
- 确定二分查找的初始范围(最小y和最大y+边长)
- 在每次迭代中计算中间y值对应的上面积
- 根据上面积与总面积一半的比较结果调整搜索范围
2.3 精度控制
题目要求答案误差不超过10^-5。我们可以通过两种方式保证精度:
- 设置二分查找的终止条件为区间长度小于10^-5
- 固定迭代次数(如50次),因为每次迭代将区间减半,50次迭代足以将初始区间(10^9)缩小到10^-15级别
第二种方法更为可靠,因为浮点数运算可能存在精度问题,固定迭代次数可以避免无限循环。
3. 算法实现细节
3.1 总面积计算
首先需要计算所有正方形的总面积。由于正方形可能重叠,总面积就是各
