
2025-08-20:分割正方形Ⅰ。用go语言,给定一个二维整数数组 squares,其中每个元素 squares[i] = [xi, yi, li] 表示一个与 x 轴平行的正方形:左下角坐标为 (xi, yi),边长为 li。
在平面上任选一条水平直线 y = h。对于每个正方形,位于该直线之上的那部分(若有)算入“上方面积”,位于直线之下的那部分(若有)算入“下方面积”。注意如果多个正方形的区域重合,重叠部分要按各自所属的正方形分别累加(即重复计数)。
目标是求出最小的 h,使得“上方面积”的总和等于“下方面积”的总和。答案与正确值的绝对误差在 1e-5 以内即视为正确。
1 <= squares.length <= 5 * 10000。
squares[i] = [xi, yi, li]。
squares[i].length == 3。
0 <= xi, yi <= 1000000000。
1 <= li <= 1000000000。
所有正方形的总面积不超过 1000000000000。
输入: squares = [[0,0,2],[1,1,1]]。
输出: 1.16667。
解释:

在这里插入图片描述
面积如下:
线下的面积:7/6 * 2 (红色) + 1/6 (蓝色) = 15/6 = 2.5。
线上的面积:5/6 * 2 (红色) + 5/6 (蓝色) = 15/6 = 2.5。
由于线以上和线以下的面积相等,输出为 7/6 = 1.16667。
题目来自力扣3453。
以输入 squares = [[0,0,2],[1,1,1]] 为例:
.
package main
import (
"fmt"
"slices"
"maps"
)
func separateSquares(squares [][]int)float64 {
totArea := 0
diff := map[int]int{}
for _, sq := range squares {
y, l := sq[1], sq[2]
totArea += l * l
diff[y] += l
diff[y+l] -= l
}
ys := slices.Sorted(maps.Keys(diff))
area, sumL := 0, 0
for i := 0; ; i++ {
sumL += diff[ys[i]] // 矩形底边长度之和
area += sumL * (ys[i+1] - ys[i]) // 底边长 * 高 = 新增面积
if area*2 >= totArea {
returnfloat64(ys[i+1]) - float64(area*2-totArea)/float64(sumL*2)
}
}
}
func main() {
squares := [][]int{{0,0,2},{1,1,1}}
result := separateSquares(squares)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
from collections import defaultdict
from typing import List
def separate_squares(squares: List[List[int]]) -> float:
if not squares:
return0.0
tot_area = 0
diff = defaultdict(int)
for x, y, l in squares:
tot_area += l * l
diff[y] += l
diff[y + l] -= l
ys = sorted(diff.keys())
area = 0 # 已累计面积(从最小 y 向上)
sum_l = 0 # 当前水平带上所有正方形的水平总长度
for i in range(len(ys) - 1):
sum_l += diff[ys[i]] # 在 y = ys[i] 处更新当前水平长度
delta = ys[i + 1] - ys[i] # 当前水平带的高度
area_prev = area
area += sum_l * delta # 将整段高度加入累计面积
# 检查是否越过总面积的一半
if area * 2 >= tot_area:
half = tot_area / 2.0
remaining = half - area_prev # 还需要的面积(在本段内)
# remaining / sum_l 为在本段内需要向上移动的高度
return ys[i] + remaining / sum_l
# 理论上不应到这里,除非输入有异常(例如 tot_area==0)
return float(ys[-1])
if __name__ == "__main__":
squares = [[0, 0, 2], [1, 1, 1]]
result = separate_squares(squares)
print(result) # 约为 1.1666666666666667
我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大规模架构师每日一题”,让 Go 语言和算法助力您的职业发展