Skip to content

Commit d472a86

Browse files
committed
feat: update solutions to lc problems: No.0790,0875
* No.0790.Domino and Tromino Tiling * No.0875.Koko Eating Bananas
1 parent 92b4e76 commit d472a86

File tree

5 files changed

+52
-35
lines changed

5 files changed

+52
-35
lines changed

solution/0100-0199/0146.LRU Cache/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ lRUCache.get(4); // 返回 4
6666
“哈希表 + 双向链表”实现。其中:
6767

6868
- 双向链表按照被使用的顺序存储 kv 键值对,靠近头部的 kv 键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
69-
- 哈希表通过缓存的 key 映射到双向链表中的位置。我们可以在 `O(1)` 时间内定位到缓存的 key 所对应的 value 在链表中的位置。
69+
- 哈希表通过缓存的 key 映射到双向链表中的位置。我们可以在 $O(1)$ 时间内定位到缓存的 key 所对应的 value 在链表中的位置。
7070

7171
对于 `get` 操作,判断 key 是否存在哈希表中:
7272

solution/0700-0799/0790.Domino and Tromino Tiling/README.md

+30-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,35 @@
4747

4848
**方法一:动态规划**
4949

50+
我们首先要读懂题意,题目实际上是让我们求铺满 $2\times n$ 的面板的方案数,其中面板上的每个正方形只能被一个瓷砖覆盖。
51+
52+
瓷砖的形状有两种,分别是 `2 x 1` 型 和 `L` 型,并且两种瓷砖都可以旋转。我们将旋转后的瓷砖分别记为 `1 x 2` 型 和 `L'` 型。
53+
54+
我们定义 $f[i][j]$ 表示平铺前 $2\times i$ 的面板,其中 $j$ 表示最后一列的状态。最后一列有 $4$ 种状态,分别是:
55+
56+
- 最后一列铺满,记为 $0$
57+
- 最后一列只铺了上方一个瓷砖,记为 $1$
58+
- 最后一列只铺了下方一个瓷砖,记为 $2$
59+
- 最后一列没有铺瓷砖,记为 $3$
60+
61+
那么答案就是 $f[n][0]$。初始时 $f[0][0]=1$,其余 $f[0][j]=0$。
62+
63+
我们考虑铺到第 $i$ 列,来看看状态转移方程:
64+
65+
当 $j=0$ 时,最后一列铺满,可由前一列的 $0,1,2,3$ 四种状态铺上对应的瓷砖转移而来,即 $f[i-1][0]$ 铺上 `1 x 2` 型瓷砖,或者 $f[i-1][1]$ 铺上 `L'` 型瓷砖,或者 $f[i-1][2]$ 铺上 `L'` 型瓷砖,或者 $f[i-1][3]$ 铺上两块 `2 x 1` 型瓷砖。因此 $f[i][0]=\sum_{j=0}^3f[i-1][j]$。
66+
67+
当 $j=1$ 时,最后一列只铺了上方一个瓷砖,可由前一列的 $2,3$ 两种状态转移而来,即 $f[i-1][2]$ 铺上 `2 x 1` 型瓷砖,或者 $f[i-1][3]$ 铺上 `L` 型瓷砖。因此 $f[i][1]=f[i-1][2]+f[i-1][3]$。
68+
69+
当 $j=2$ 时,最后一列只铺了下方一个瓷砖,可由前一列的 $1,3$ 两种状态转移而来,即 $f[i-1][1]$ 铺上 `2 x 1` 型瓷砖,或者 $f[i-1][3]$ 铺上 `L'` 型瓷砖。因此 $f[i][2]=f[i-1][1]+f[i-1][3]$。
70+
71+
当 $j=3$ 时,最后一列没有铺瓷砖,可由前一列的 $0$ 一种状态转移而来,即 $f[i-1][0]$ 铺上两块 `2 x 1` 型瓷砖。因此 $f[i][3]=f[i-1][0]$。
72+
73+
可以发现,状态转移方程中只涉及到前一列的状态,因此我们可以使用滚动数组优化空间复杂度。
74+
75+
注意,过程中的状态数值可能会很大,因此需要对 $10^9+7$ 取模。
76+
77+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为面板的列数。
78+
5079
<!-- tabs:start -->
5180

5281
### **Python3**
@@ -70,7 +99,7 @@ class Solution:
7099
else:
71100
ans = dfs(i + 2, j) + dfs(i + 2, j + 1)
72101
return ans % mod
73-
102+
74103
mod = 10**9 + 7
75104
return dfs(0, 0)
76105
```

solution/0800-0899/0875.Koko Eating Bananas/README.md

+7-11
Original file line numberDiff line numberDiff line change
@@ -130,20 +130,16 @@ public:
130130
131131
```go
132132
func minEatingSpeed(piles []int, h int) int {
133-
left, right := 1, int(1e9)
134-
for left < right {
135-
mid := (left + right) >> 1
133+
return sort.Search(1e9, func(i int) bool {
134+
if i == 0 {
135+
return false
136+
}
136137
s := 0
137138
for _, x := range piles {
138-
s += (x + mid - 1) / mid
139-
}
140-
if s <= h {
141-
right = mid
142-
} else {
143-
left = mid + 1
139+
s += (x + i - 1) / i
144140
}
145-
}
146-
return left
141+
return s <= h
142+
})
147143
}
148144
```
149145

solution/0800-0899/0875.Koko Eating Bananas/README_EN.md

+7-11
Original file line numberDiff line numberDiff line change
@@ -113,20 +113,16 @@ public:
113113
114114
```go
115115
func minEatingSpeed(piles []int, h int) int {
116-
left, right := 1, int(1e9)
117-
for left < right {
118-
mid := (left + right) >> 1
116+
return sort.Search(1e9, func(i int) bool {
117+
if i == 0 {
118+
return false
119+
}
119120
s := 0
120121
for _, x := range piles {
121-
s += (x + mid - 1) / mid
122-
}
123-
if s <= h {
124-
right = mid
125-
} else {
126-
left = mid + 1
122+
s += (x + i - 1) / i
127123
}
128-
}
129-
return left
124+
return s <= h
125+
})
130126
}
131127
```
132128

Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
func minEatingSpeed(piles []int, h int) int {
2-
left, right := 1, int(1e9)
3-
for left < right {
4-
mid := (left + right) >> 1
2+
return sort.Search(1e9, func(i int) bool {
3+
if i == 0 {
4+
return false
5+
}
56
s := 0
67
for _, x := range piles {
7-
s += (x + mid - 1) / mid
8-
}
9-
if s <= h {
10-
right = mid
11-
} else {
12-
left = mid + 1
8+
s += (x + i - 1) / i
139
}
14-
}
15-
return left
10+
return s <= h
11+
})
1612
}

0 commit comments

Comments
 (0)