Skip to content

Commit 743098d

Browse files
committed
add the python solution of problem 0735
1 parent bd92a69 commit 743098d

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
## 行星碰撞
2+
3+
### 问题描述
4+
5+
给定一个整数数组 asteroids,表示在同一行的行星。
6+
7+
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
8+
9+
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
10+
11+
**示例1:**
12+
```
13+
输入:
14+
asteroids = [5, 10, -5]
15+
输出: [5, 10]
16+
解释:
17+
10 和 -5 碰撞后只剩下 10。 5 和 10 永远不会发生碰撞。
18+
```
19+
**示例2:**
20+
```
21+
输入:
22+
asteroids = [8, -8]
23+
输出: []
24+
解释:
25+
8 和 -8 碰撞后,两者都发生爆炸。
26+
```
27+
**说明:**
28+
- 数组 asteroids 的长度不超过 10000。
29+
- 每一颗行星的大小都是非零整数,范围是 [-1000, 1000]
30+
31+
### 解法
32+
33+
从左向右遍历数组。
34+
- 对于遇到的大于零的小行星,应先假定其存活;
35+
- 对于遇到的小于零的小行星`x`,其绝对值为'val',若之前没有大于零的小行星,则此小行星会存活。若之前有大于零的小行星,则从右到左遍历之前存活的小行星:
36+
- 遇到值小于零的小行星,则小行星`x`存活,并停止;
37+
- 遇到值等于'val'的小行星,那个小行星会爆炸,并停止;
38+
- 遇到值大于'val'的小行星停止;
39+
- 遇到值大于零小于'val'的小行星,那个小行星会爆炸,并继续向左遍历;
40+
41+
```python
42+
class Solution:
43+
def asteroidCollision(self, asteroids):
44+
if not asteroids:
45+
return []
46+
ans = []
47+
for i in asteroids:
48+
if i > 0:
49+
ans.append(i)
50+
if i < 0:
51+
if not ans or ans[-1] < 0:
52+
ans.append(i)
53+
else:
54+
while ans:
55+
if ans[-1] < 0:
56+
ans.append(i)
57+
break
58+
elif ans[-1] > abs(i):
59+
break
60+
elif ans[-1] == abs(i):
61+
ans.pop(-1)
62+
break
63+
else:
64+
ans.pop(-1)
65+
66+
else:
67+
ans.append(i)
68+
return ans
69+
```
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution:
2+
def asteroidCollision(self, asteroids):
3+
"""
4+
:type asteroids: List[int]
5+
:rtype: List[int]
6+
"""
7+
if not asteroids:
8+
return []
9+
ans = []
10+
for i in asteroids:
11+
if i > 0:
12+
ans.append(i)
13+
if i < 0:
14+
if not ans or ans[-1] < 0:
15+
ans.append(i)
16+
else:
17+
while ans:
18+
if ans[-1] < 0:
19+
ans.append(i)
20+
break
21+
elif ans[-1] > abs(i):
22+
break
23+
elif ans[-1] == abs(i):
24+
ans.pop(-1)
25+
break
26+
else:
27+
ans.pop(-1)
28+
29+
else:
30+
ans.append(i)
31+
return ans

0 commit comments

Comments
 (0)