这个问题来自Leetcode,标题为门户:矩形区域
难度:中等
编程语言:围棋
1. 主题介绍
在由直线组成的二维平面上给出两个矩形矩形面积公式,其边平行/垂直于坐标轴,您可以计算并返回两个矩形覆盖的总面积。
每个矩形由其左下角顶点和右上角顶点坐标表示
1. 第一个矩形由其左下角顶点(ax1, ay1)和右上角顶点(ax2, ay2)定义。
2. 第二个矩形由其左下角顶点(bx1, by1)和右上角顶点(bx2, by2)定义。
引自leetcode
示例 1:
输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
输出:45
示例 2:
输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
输出:16
提示:
1. -10^4 bx1
3. BX2 > BX1
4. by2 > by1
反映在轴上,是计算重叠的w和h。
绿色部分是重叠部分,如您所见:
1. W = 最小(ax2,bx2) - 最大(ax1,bx1)
2. h = 最小值(ay2,by2) - 最大值(ay1,by1)
如果w或h为负或0,则表示重叠为0,最终结果是减去重叠面积。
在此方法下:
1. 时间复杂度为O(1);
2. 空间复杂度为O(1)。
3. 源代码展示
先测试
func Test_computeArea(t *testing.T) {
inputs := [][]int{ {-3, 0, 3, 4, 0, -1, 9, 2 }, {-2, -2, 2, 2, -2, -2, 2, 2}, {-2, -2, 2, 2, 3, 3, 4, 4}}
expects := []int{45, 16, 17}
for i := 0; i < len(inputs); i++ {
got := computeArea(inputs[i][0], inputs[i][1], inputs[i][2], inputs[i][3], inputs[i][4], inputs[i][5], inputs[i][6], inputs[i][7])
expected := expects[i]
if got != expected {
t.Fatalf("[%d,%v] want %d,got %d", i+1, inputs[i], expected, got)
}
}
}
方法实现
func computeArea(ax1 int, ay1 int, ax2 int, ay2 int, bx1 int, by1 int, bx2 int, by2 int) int {
area := (ax2-ax1)*(ay2-ay1) + (bx2-bx1)*(by2-by1)
w := min(ax2, bx2) - max(ax1, bx1)
if w <= 0 {
return area
}
h := min(ay2, by2) - max(ay1, by1)
if h <= 0 {
return area
}
return area - w*h
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
Leetcode 操作的结果
生活还是要继续,每天花半个小时,放下焦虑矩形面积公式,用行动积累更好的自己,让我们一起加油!引用来自 Leetcode,其中 0 表示小于 1 个单位