Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0070599

Browse files
feat: add solutions to lc/lcof2 problem: Asteroid Collision
1 parent 92e73c3 commit 0070599

File tree

11 files changed

+410
-31
lines changed

11 files changed

+410
-31
lines changed

‎lcof2/剑指 Offer II 037. 小行星碰撞/README.md‎

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,110 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62+
可以类比成左右括号匹配:
63+
64+
- 向右移动的小行星(左括号):不会引发碰撞,直接入栈
65+
- 向左移动的小行星(右括号):可能会和之前向右移动的小行星发生碰撞,特殊处理
66+
67+
因为答案需要碰撞后剩下的所有小行星,相当于栈里最后剩下的元素,所以可以直接用数组表示栈
68+
6269
<!-- tabs:start -->
6370

6471
### **Python3**
6572

6673
<!-- 这里可写当前语言的特殊实现逻辑 -->
6774

6875
```python
69-
76+
class Solution:
77+
def asteroidCollision(self, asteroids: List[int]) -> List[int]:
78+
ans = []
79+
for a in asteroids:
80+
if a > 0:
81+
ans.append(a)
82+
else:
83+
while len(ans) > 0 and ans[-1] > 0 and ans[-1] < -a:
84+
ans.pop()
85+
if len(ans) > 0 and ans[-1] == -a:
86+
ans.pop()
87+
elif len(ans) == 0 or ans[-1] < -a:
88+
ans.append(a)
89+
return ans
7090
```
7191

7292
### **Java**
7393

7494
<!-- 这里可写当前语言的特殊实现逻辑 -->
7595

7696
```java
97+
class Solution {
98+
public int[] asteroidCollision(int[] asteroids) {
99+
Deque<Integer> d = new ArrayDeque<>();
100+
for (int a : asteroids) {
101+
if (a > 0) {
102+
d.offerLast(a);
103+
} else {
104+
while (!d.isEmpty() && d.peekLast() > 0 && d.peekLast() < -a) {
105+
d.pollLast();
106+
}
107+
if (!d.isEmpty() && d.peekLast() == -a) {
108+
d.pollLast();
109+
} else if (d.isEmpty() || d.peekLast() < -a) {
110+
d.offerLast(a);
111+
}
112+
}
113+
}
114+
return d.stream().mapToInt(Integer::valueOf).toArray();
115+
}
116+
}
117+
```
118+
119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
vector<int> asteroidCollision(vector<int>& asteroids) {
125+
vector<int> ans;
126+
for (int a : asteroids) {
127+
if (a > 0) {
128+
ans.push_back(a);
129+
} else {
130+
while (!ans.empty() && ans.back() > 0 && ans.back() < -a) {
131+
ans.pop_back();
132+
}
133+
if (!ans.empty() && ans.back() == -a) {
134+
ans.pop_back();
135+
} else if (ans.empty() || ans.back() < -a) {
136+
ans.push_back(a);
137+
}
138+
}
139+
}
140+
return ans;
141+
}
142+
};
143+
```
77144
145+
### **Go**
146+
147+
```go
148+
func asteroidCollision(asteroids []int) []int {
149+
var ans []int
150+
for _, a := range asteroids {
151+
if a > 0 {
152+
ans = append(ans, a)
153+
} else {
154+
for len(ans) > 0 && ans[len(ans)-1] > 0 && ans[len(ans)-1] < -a {
155+
ans = ans[:len(ans)-1]
156+
}
157+
if len(ans) > 0 && ans[len(ans)-1] == -a {
158+
ans = ans[:len(ans)-1]
159+
} else if len(ans) == 0 || ans[len(ans)-1] < -a {
160+
ans = append(ans, a)
161+
}
162+
}
163+
}
164+
return ans
165+
}
78166
```
79167

80168
### **...**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
vector<int> asteroidCollision(vector<int>& asteroids) {
4+
vector<int> ans;
5+
for (int a : asteroids) {
6+
if (a > 0) {
7+
ans.push_back(a);
8+
} else {
9+
while (!ans.empty() && ans.back() > 0 && ans.back() < -a) {
10+
ans.pop_back();
11+
}
12+
if (!ans.empty() && ans.back() == -a) {
13+
ans.pop_back();
14+
} else if (ans.empty() || ans.back() < -a) {
15+
ans.push_back(a);
16+
}
17+
}
18+
}
19+
return ans;
20+
}
21+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func asteroidCollision(asteroids []int) []int {
2+
var ans []int
3+
for _, a := range asteroids {
4+
if a > 0 {
5+
ans = append(ans, a)
6+
} else {
7+
for len(ans) > 0 && ans[len(ans)-1] > 0 && ans[len(ans)-1] < -a {
8+
ans = ans[:len(ans)-1]
9+
}
10+
if len(ans) > 0 && ans[len(ans)-1] == -a {
11+
ans = ans[:len(ans)-1]
12+
} else if len(ans) == 0 || ans[len(ans)-1] < -a {
13+
ans = append(ans, a)
14+
}
15+
}
16+
}
17+
return ans
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int[] asteroidCollision(int[] asteroids) {
3+
Deque<Integer> d = new ArrayDeque<>();
4+
for (int a : asteroids) {
5+
if (a > 0) {
6+
d.offerLast(a);
7+
} else {
8+
while (!d.isEmpty() && d.peekLast() > 0 && d.peekLast() < -a) {
9+
d.pollLast();
10+
}
11+
if (!d.isEmpty() && d.peekLast() == -a) {
12+
d.pollLast();
13+
} else if (d.isEmpty() || d.peekLast() < -a) {
14+
d.offerLast(a);
15+
}
16+
}
17+
}
18+
return d.stream().mapToInt(Integer::valueOf).toArray();
19+
}
20+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def asteroidCollision(self, asteroids: List[int]) -> List[int]:
3+
ans = []
4+
for a in asteroids:
5+
if a > 0:
6+
ans.append(a)
7+
else:
8+
while len(ans) > 0 and ans[-1] > 0 and ans[-1] < -a:
9+
ans.pop()
10+
if len(ans) > 0 and ans[-1] == -a:
11+
ans.pop()
12+
elif len(ans) == 0 or ans[-1] < -a:
13+
ans.append(a)
14+
return ans

‎solution/0700-0799/0735.Asteroid Collision/README.md‎

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,110 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
可以类比成左右括号匹配:
61+
62+
- 向右移动的小行星(左括号):不会引发碰撞,直接入栈
63+
- 向左移动的小行星(右括号):可能会和之前向右移动的小行星发生碰撞,特殊处理
64+
65+
因为答案需要碰撞后剩下的所有小行星,相当于栈里最后剩下的元素,所以可以直接用数组表示栈
66+
6067
<!-- tabs:start -->
6168

6269
### **Python3**
6370

6471
<!-- 这里可写当前语言的特殊实现逻辑 -->
6572

6673
```python
67-
74+
class Solution:
75+
def asteroidCollision(self, asteroids: List[int]) -> List[int]:
76+
ans = []
77+
for a in asteroids:
78+
if a > 0:
79+
ans.append(a)
80+
else:
81+
while len(ans) > 0 and ans[-1] > 0 and ans[-1] < -a:
82+
ans.pop()
83+
if len(ans) > 0 and ans[-1] == -a:
84+
ans.pop()
85+
elif len(ans) == 0 or ans[-1] < -a:
86+
ans.append(a)
87+
return ans
6888
```
6989

7090
### **Java**
7191

7292
<!-- 这里可写当前语言的特殊实现逻辑 -->
7393

7494
```java
95+
class Solution {
96+
public int[] asteroidCollision(int[] asteroids) {
97+
Deque<Integer> d = new ArrayDeque<>();
98+
for (int a : asteroids) {
99+
if (a > 0) {
100+
d.offerLast(a);
101+
} else {
102+
while (!d.isEmpty() && d.peekLast() > 0 && d.peekLast() < -a) {
103+
d.pollLast();
104+
}
105+
if (!d.isEmpty() && d.peekLast() == -a) {
106+
d.pollLast();
107+
} else if (d.isEmpty() || d.peekLast() < -a) {
108+
d.offerLast(a);
109+
}
110+
}
111+
}
112+
return d.stream().mapToInt(Integer::valueOf).toArray();
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
vector<int> asteroidCollision(vector<int>& asteroids) {
123+
vector<int> ans;
124+
for (int a : asteroids) {
125+
if (a > 0) {
126+
ans.push_back(a);
127+
} else {
128+
while (!ans.empty() && ans.back() > 0 && ans.back() < -a) {
129+
ans.pop_back();
130+
}
131+
if (!ans.empty() && ans.back() == -a) {
132+
ans.pop_back();
133+
} else if (ans.empty() || ans.back() < -a) {
134+
ans.push_back(a);
135+
}
136+
}
137+
}
138+
return ans;
139+
}
140+
};
141+
```
75142
143+
### **Go**
144+
145+
```go
146+
func asteroidCollision(asteroids []int) []int {
147+
var ans []int
148+
for _, a := range asteroids {
149+
if a > 0 {
150+
ans = append(ans, a)
151+
} else {
152+
for len(ans) > 0 && ans[len(ans)-1] > 0 && ans[len(ans)-1] < -a {
153+
ans = ans[:len(ans)-1]
154+
}
155+
if len(ans) > 0 && ans[len(ans)-1] == -a {
156+
ans = ans[:len(ans)-1]
157+
} else if len(ans) == 0 || ans[len(ans)-1] < -a {
158+
ans = append(ans, a)
159+
}
160+
}
161+
}
162+
return ans
163+
}
76164
```
77165

78166
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /