Skip to content

Commit ed120d8

Browse files
author
robot
committed
feat: $838
1 parent b724e44 commit ed120d8

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
361361
- [0801. 使序列递增的最小交换次数](./problems/801.minimum-swaps-to-make-sequences-increasing.md)
362362
- [0816. 模糊坐标](./problems/816.ambiguous-coordinates.md)
363363
- [0820. 单词的压缩编码](./problems/820.short-encoding-of-words.md)
364+
- [0838. 推多米诺](./problems/838.push-dominoes.md)
364365
- [0873. 最长的斐波那契子序列的长度](./problems/873.length-of-longest-fibonacci-subsequence.md)
365366
- [0875. 爱吃香蕉的珂珂](./problems/875.koko-eating-bananas.md)
366367
- [0877. 石子游戏](./problems/877.stone-game.md)

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@
210210
- [0801. 使序列递增的最小交换次数](./problems/801.minimum-swaps-to-make-sequences-increasing.md) 👍
211211
- [0816. 模糊坐标](./problems/816.ambiguous-coordinates.md) 👍
212212
- [0820. 单词的压缩编码](./problems/820.short-encoding-of-words.md)
213+
- [0838. 推多米诺](./problems/838.push-dominoes.md)
213214
- [0873. 最长的斐波那契子序列的长度](./problems/873.length-of-longest-fibonacci-subsequence.md) 👍
214215
- [0875. 爱吃香蕉的珂珂](./problems/875.koko-eating-bananas.md)
215216
- [0877. 石子游戏](./problems/877.stone-game.md)

problems/838.push-dominoes.md

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
## 题目地址(838. 推多米诺)
2+
3+
https://leetcode-cn.com/problems/push-dominoes/
4+
5+
## 题目描述
6+
7+
```
8+
一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立。
9+
10+
在开始时,我们同时把一些多米诺骨牌向左或向右推。
11+
12+
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。
13+
14+
同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
15+
16+
如果同时有多米诺骨牌落在一张垂直竖立的多米诺骨牌的两边,由于受力平衡, 该骨牌仍然保持不变。
17+
18+
就这个问题而言,我们会认为正在下降的多米诺骨牌不会对其它正在下降或已经下降的多米诺骨牌施加额外的力。
19+
20+
给定表示初始状态的字符串 "S" 。如果第 i 张多米诺骨牌被推向左边,则 S[i] = 'L';如果第 i 张多米诺骨牌被推向右边,则 S[i] = 'R';如果第 i 张多米诺骨牌没有被推动,则 S[i] = '.'。
21+
22+
返回表示最终状态的字符串。
23+
24+
示例 1:
25+
26+
输入:".L.R...LR..L.."
27+
输出:"LL.RR.LLRRLL.."
28+
29+
示例 2:
30+
31+
输入:"RR.L"
32+
输出:"RR.L"
33+
说明:第一张多米诺骨牌没有给第二张施加额外的力。
34+
35+
提示:
36+
37+
0 <= N <= 10^5
38+
表示多米诺骨牌状态的字符串只含有 'L','R'; 以及 '.';
39+
```
40+
41+
## 前置知识
42+
43+
- 双指针
44+
- 哨兵
45+
46+
## 公司
47+
48+
- 暂无
49+
50+
## 思路
51+
52+
首先最终的 dominoes 状态一定满足:
53+
54+
- 如果该 domino 受力了(L 或者 R),那么最终状态一定是受力的状态。比如 domino 受力为 L,那么最终状态一定也是 L,R 也是同理。
55+
- 如果一个 domino 没有受力,那么其可能保持原样,也可能由于其他 domino 而导致其变为 L 或者 R
56+
57+
因此我们只需要探究字符串 dominoes 中的 "." 在最终是 L 还是 R 即可。这里有一个关键点:**只有相邻的受力 dominoes 才会相互影响**。比如 .L...R..L 那么:
58+
59+
- 只有第一个 L 和 R 有可能有影响
60+
- R 和第二个 L 有影响
61+
- 第一个 L 和 第二个 L 没有影响,因为二者并不相邻
62+
63+
想清楚这些,我们的算法就比较简单了。
64+
65+
我们可以使用双指针。其中:
66+
67+
- 左指针指向第一个受力 domino
68+
- 右指针指向下一个受力 domino
69+
70+
左指针和右指针之前的 domino(一定是 .),最终的状态由左右指针指向而定。
71+
72+
具体地:
73+
74+
- 如果左指针是 L,右指针是 R,那么中间保持 . 不变
75+
- 如果左指针是 L,右指针是 L,那么中间都是 L
76+
- 如果左指针是 R,右指针是 R,那么中间都是 R
77+
- 如果左指针是 R,右指针是 L,那么中间左半部分是 R 有右部分是 L,最中间(如果中间的 domino 个数是奇数的话)是 .
78+
79+
为了简化判断,可以在 domino 前放一个 L,后放一个 R。
80+
81+
## 关键点
82+
83+
- 只有相邻的受力 dominoes 才会相互影响
84+
- 使用哨兵简化操作
85+
86+
## 代码
87+
88+
- 语言支持:Python3
89+
90+
Python3 Code:
91+
92+
```python
93+
94+
class Solution:
95+
def pushDominoes(self, dominoes: str) -> str:
96+
dominoes = 'L' + dominoes + 'R'
97+
i = 0
98+
j = i + 1
99+
ans = ''
100+
while j < len(dominoes):
101+
if dominoes[j] == '.':
102+
j += 1
103+
continue
104+
count = (j - i - 1)
105+
if i != 0 :ans += dominoes[i]
106+
if dominoes[i] == 'L' and dominoes[j] == 'R':
107+
ans += '.' * count
108+
elif dominoes[i] == 'L' and dominoes[j] == 'L':
109+
ans += 'L' * count
110+
elif dominoes[i] == 'R' and dominoes[j] == 'R':
111+
ans += 'R' * count
112+
elif dominoes[i] == 'R' and dominoes[j] == 'L':
113+
ans += 'R' * (count//2) + '.'*(count%2) + 'L' * (count//2)
114+
i = j
115+
j += 1
116+
return ans
117+
118+
119+
120+
```
121+
122+
**复杂度分析**
123+
124+
令 n 为数组长度。
125+
126+
- 时间复杂度:$O(n)$
127+
- 空间复杂度:$O(1)$
128+
129+
> 此题解由 [力扣刷题插件](https://leetcode-pp.github.io/leetcode-cheat/?tab=solution-template) 自动生成。
130+
131+
力扣的小伙伴可以[关注我](https://leetcode-cn.com/u/fe-lucifer/),这样就会第一时间收到我的动态啦~
132+
133+
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
134+
135+
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
136+
137+
![](https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg)

0 commit comments

Comments
 (0)