Skip to content

Commit 7cf38a7

Browse files
committed
feat: leetcode 223
1 parent d8c1882 commit 7cf38a7

File tree

7 files changed

+141
-0
lines changed

7 files changed

+141
-0
lines changed

assets/data/category.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,12 @@
12591259
"path": "../../problemset/the-skyline-problem/README.md",
12601260
"difficulty": "困难"
12611261
},
1262+
{
1263+
"id": 223,
1264+
"title": "矩形面积",
1265+
"path": "../../problemset/rectangle-area/README.md",
1266+
"difficulty": "中等"
1267+
},
12621268
{
12631269
"id": 258,
12641270
"title": "各位相加",

assets/data/problems.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1979,6 +1979,16 @@
19791979
"url": "https://leetcode-cn.com/problems/count-complete-tree-nodes/",
19801980
"path": "../../problemset/count-complete-tree-nodes/README.md"
19811981
},
1982+
{
1983+
"id": 223,
1984+
"title": {
1985+
"cn": "矩形面积",
1986+
"en": "rectangle-area"
1987+
},
1988+
"difficulty": "中等",
1989+
"url": "https://leetcode-cn.com/problems/rectangle-area/",
1990+
"path": "../../problemset/rectangle-area/README.md"
1991+
},
19821992
{
19831993
"id": 258,
19841994
"title": {

assets/docs/CATEGORY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@
251251
| 165. [比较版本号](../../problemset/compare-version-numbers/README.md) | 中等 |
252252
| 189. [轮转数组](../../problemset/rotate-array/README.md) | 中等 |
253253
| 218. [天际线问题](../../problemset/the-skyline-problem/README.md) | 困难 |
254+
| 223. [矩形面积](../../problemset/rectangle-area/README.md) | 中等 |
254255
| 258. [各位相加](../../problemset/add-digits/README.md) | 简单 |
255256
| 307. [ 区域和检索 - 数组可修改](../../problemset/range-sum-query-mutable/README.md) | 中等 |
256257
| 310. [最小高度树](../../problemset/minimum-height-trees/README.md) | 中等 |

assets/docs/PROBLEMS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,8 @@
396396

397397
[222. 完全二叉树的节点个数](../../problemset/count-complete-tree-nodes/README.md)
398398

399+
[223. 矩形面积](../../problemset/rectangle-area/README.md)
400+
399401
[258. 各位相加](../../problemset/add-digits/README.md)
400402

401403
[300. 最长递增子序列](../../problemset/longest-increasing-subsequence/README.md)

problemset/rectangle-area/README.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# 矩形面积
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode-cn.com/problems/rectangle-area/
6+
7+
## 题目
8+
9+
给你 **二维** 平面上两个 **由直线构成且边与坐标轴平行/垂直** 的矩形,请你计算并返回两个矩形覆盖的总面积。
10+
11+
每个矩形由其 **左下** 顶点和 **右上** 顶点坐标表示:
12+
13+
- 第一个矩形由其左下顶点 `(ax1, ay1)` 和右上顶点 `(ax2, ay2)` 定义。
14+
- 第二个矩形由其左下顶点 `(bx1, by1)` 和右上顶点 `(bx2, by2)` 定义。
15+
16+
### 示例
17+
18+
#### 示例 1:
19+
20+
![rectangle-plane](https://user-images.githubusercontent.com/54696834/162101539-4044537e-76bc-4309-a200-08880873c462.png)
21+
22+
```
23+
输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
24+
输出:45
25+
```
26+
27+
#### 示例 2:
28+
29+
```
30+
输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
31+
输出:16
32+
```
33+
34+
## 解题
35+
36+
```ts
37+
/**
38+
* 计算重叠面积
39+
* @desc 时间复杂度 O(1) 空间复杂度 O(1)
40+
* @param ax1
41+
* @param ay1
42+
* @param ax2
43+
* @param ay2
44+
* @param bx1
45+
* @param by1
46+
* @param bx2
47+
* @param by2
48+
* @returns
49+
*/
50+
export function computeArea(
51+
ax1: number,
52+
ay1: number,
53+
ax2: number,
54+
ay2: number,
55+
bx1: number,
56+
by1: number,
57+
bx2: number,
58+
by2: number,
59+
): number {
60+
const area1 = (ax2 - ax1) * (ay2 - ay1)
61+
const area2 = (bx2 - bx1) * (by2 - by1)
62+
const overlapWidth = Math.min(ax2, bx2) - Math.max(ax1, bx1)
63+
const overlapHeight = Math.min(ay2, by2) - Math.max(ay1, by1)
64+
const overlapArea = Math.max(overlapWidth, 0) * Math.max(overlapHeight, 0)
65+
return area1 + area2 - overlapArea
66+
}
67+
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { computeArea } from '.'
3+
4+
describe('矩形面积', () => {
5+
testCase(computeArea)
6+
})
7+
8+
function testCase(fn:
9+
(
10+
ax1: number,
11+
ay1: number,
12+
ax2: number,
13+
ay2: number,
14+
bx1: number,
15+
by1: number,
16+
bx2: number,
17+
by2: number
18+
) => number) {
19+
it.each([
20+
[-3, 0, 3, 4, 0, -1, 9, 2, 45],
21+
[-2, -2, 2, 2, -2, -2, 2, 2, 16],
22+
])('示例%#', (ax1, ay1, ax2, ay2, bx1, by1, bx2, by2, expected) => {
23+
expect(fn(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2)).toBe(expected)
24+
})
25+
}

problemset/rectangle-area/index.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* 计算重叠面积
3+
* @desc 时间复杂度 O(1) 空间复杂度 O(1)
4+
* @param ax1
5+
* @param ay1
6+
* @param ax2
7+
* @param ay2
8+
* @param bx1
9+
* @param by1
10+
* @param bx2
11+
* @param by2
12+
* @returns
13+
*/
14+
export function computeArea(
15+
ax1: number,
16+
ay1: number,
17+
ax2: number,
18+
ay2: number,
19+
bx1: number,
20+
by1: number,
21+
bx2: number,
22+
by2: number,
23+
): number {
24+
const area1 = (ax2 - ax1) * (ay2 - ay1)
25+
const area2 = (bx2 - bx1) * (by2 - by1)
26+
const overlapWidth = Math.min(ax2, bx2) - Math.max(ax1, bx1)
27+
const overlapHeight = Math.min(ay2, by2) - Math.max(ay1, by1)
28+
const overlapArea = Math.max(overlapWidth, 0) * Math.max(overlapHeight, 0)
29+
return area1 + area2 - overlapArea
30+
}

0 commit comments

Comments
 (0)