Skip to content

Commit 4ef3376

Browse files
committed
feat: leetcode 剑指 Offer II 091
1 parent 1712466 commit 4ef3376

File tree

8 files changed

+126
-2
lines changed

8 files changed

+126
-2
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<p align="center">
44
<!-- TOPICS COUNT START -->
5-
<img src="https://img.shields.io/badge/-进度:412-green" alt="进度:412">
5+
<img src="https://img.shields.io/badge/-进度:413-green" alt="进度:413">
66
<!-- TOPICS COUNT END -->
77
<a href="./assets/docs/TOPICS.md"><img src="https://img.shields.io/badge/-题库目录-blue" alt="题库目录"></a>
88
<a href="./assets/docs/CATEGORIES.md"><img src="https://img.shields.io/badge/-题库分类-red" alt="题库分类"></a>

assets/data/categories.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,12 @@
13861386
"title": "适合打劫银行的日子",
13871387
"path": "./problemset/find-good-days-to-rob-the-bank/README.md",
13881388
"difficulty": "中等"
1389+
},
1390+
{
1391+
"id": "剑指 Offer II 091",
1392+
"title": "粉刷房子",
1393+
"path": "./problemset/paint-house/README.md",
1394+
"difficulty": "中等"
13891395
}
13901396
]
13911397
},

assets/data/topics.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4118,5 +4118,15 @@
41184118
"difficulty": "中等",
41194119
"url": "https://leetcode.cn/problems/4ueAj6/",
41204120
"path": "./problemset/sorted-circular-linked-list/README.md"
4121+
},
4122+
{
4123+
"id": "剑指 Offer II 091",
4124+
"title": {
4125+
"cn": "粉刷房子",
4126+
"en": "paint-house"
4127+
},
4128+
"difficulty": "中等",
4129+
"url": "https://leetcode.cn/problems/JEj789/",
4130+
"path": "./problemset/paint-house/README.md"
41214131
}
41224132
]

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@
264264
| 926. [将字符串翻转到单调递增](../../problemset/flip-string-to-monotone-increasing/README.md) | 中等 |
265265
| 1994. [好子集的数目](../../problemset/the-number-of-good-subsets/README.md) | 困难 |
266266
| 2100. [适合打劫银行的日子](../../problemset/find-good-days-to-rob-the-bank/README.md) | 中等 |
267+
| 剑指 Offer II 091. [粉刷房子](../../problemset/paint-house/README.md) | 中等 |
267268

268269
## 双指针
269270

assets/docs/TOPICS.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,4 +822,6 @@
822822

823823
[剑指 Offer II 114. 外星文字典](../../problemset/alien-dictionary/README.md)
824824

825-
[剑指 Offer II 029. 排序的循环链表](../../problemset/sorted-circular-linked-list/README.md)
825+
[剑指 Offer II 029. 排序的循环链表](../../problemset/sorted-circular-linked-list/README.md)
826+
827+
[剑指 Offer II 091. 粉刷房子](../../problemset/paint-house/README.md)

problemset/paint-house/README.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# 粉刷房子
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode.cn/problems/JEj789/
6+
7+
## 题目
8+
9+
假如有一排房子,共 `n` 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
10+
11+
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 `n x 3` 的正整数矩阵 `costs` 来表示的。
12+
13+
例如,`costs[0][0]` 表示第 `0` 号房子粉刷成红色的成本花费;`costs[1][2]` 表示第 `1` 号房子粉刷成绿色的花费,以此类推。
14+
15+
请计算出粉刷完所有房子最少的花费成本。
16+
17+
### 示例
18+
19+
#### 示例 1:
20+
21+
```
22+
输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
23+
输出: 10
24+
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
25+
  最少花费: 2 + 5 + 3 = 10。
26+
```
27+
28+
#### 示例 2:
29+
30+
```
31+
输入: costs = [[7,6,2]]
32+
输出: 2
33+
```
34+
35+
## 解题
36+
37+
```ts
38+
/**
39+
* 动态规划
40+
* @desc 时间复杂度 O(N) 空间复杂度 O(1)
41+
* @param costs
42+
* @returns
43+
*/
44+
export function minCost(costs: number[][]): number {
45+
const len = costs.length
46+
let dp = [...costs[0]]
47+
48+
for (let i = 1; i < len; i++) {
49+
const newDp = [0, 0, 0]
50+
for (let j = 0; j < 3; j++) {
51+
newDp[j] = Math.min(
52+
dp[(j + 1) % 3],
53+
dp[(j + 2) % 3],
54+
) + costs[i][j]
55+
}
56+
dp = newDp
57+
}
58+
59+
return Math.min(...dp)
60+
}
61+
```

problemset/paint-house/index.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { minCost } from '.'
3+
4+
describe('粉刷房子', () => {
5+
testCase(minCost)
6+
})
7+
8+
function testCase(fn: (costs: number[][]) => number) {
9+
it.each([
10+
[
11+
[[17, 2, 17], [16, 16, 5], [14, 3, 19]],
12+
10,
13+
],
14+
[
15+
[[7, 6, 2]],
16+
2,
17+
],
18+
])('示例%#', (costs, expected) => {
19+
expect(fn(costs)).toBe(expected)
20+
})
21+
}

problemset/paint-house/index.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* 动态规划
3+
* @desc 时间复杂度 O(N) 空间复杂度 O(1)
4+
* @param costs
5+
* @returns
6+
*/
7+
export function minCost(costs: number[][]): number {
8+
const len = costs.length
9+
let dp = [...costs[0]]
10+
11+
for (let i = 1; i < len; i++) {
12+
const newDp = [0, 0, 0]
13+
for (let j = 0; j < 3; j++) {
14+
newDp[j] = Math.min(
15+
dp[(j + 1) % 3],
16+
dp[(j + 2) % 3],
17+
) + costs[i][j]
18+
}
19+
dp = newDp
20+
}
21+
22+
return Math.min(...dp)
23+
}

0 commit comments

Comments
 (0)