好好学习,天天向上,一流范文网欢迎您!
当前位置: >> 体会 >> 各类感言 内容页

中等编程语言:Go1.题目介绍给你二维平面上两个

这个问题来自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 个单位