Asteroid Collision
The problem
You are given an integer array **asteroids **representing asteroids in a row. Each asteroid moves at the same speed.
The **absolute value **of an asteroid represents its size. The sign of an asteroid represents its direction: positive (+) means moving right, negative (-) means moving left.
Collision rules:
- Asteroids moving in the same direction never collide.
- When two asteroids moving in opposite directions collide, the smaller asteroid explodes and the larger asteroid continues moving in the same direction.
- If both asteroids are equal in size, both explode.
- Collisions are resolved one at a time, from left to right. If an asteroid survives a collision, it continues moving and may collide immediately with the next asteroid in its path.
Return the **state **of the **asteroids **after all collisions as an array in the same order.
**Input: **asteroids = [1, 2, 3, -4, -2] Output: [-4, -2] Explanation:
- Asteroid 3 and -4 collide → 3 explodes, -4 survives.
- Asteroid -4 continues and collides with 2 → 2 explodes, -4 continues.
- Asteroid -4 collides with 1 → 1 explodes, -4 continues.
- Next asteroid -2 is moving left → no collision. Final state: [-4, -2].
Input: asteroids = [5, 10, -5, -10, 8, -8, -3, 12] Output: [5, 12] Explanation:
- Asteroid 10 and -5 collide → -5 explodes, 10 survives.
- Asteroid 10 and -10 collide → both explode.
- Asteroid 8 and -8 collide → both explode.
- Asteroid -3 moves left → collides with 5 (right-moving) → 5 > 3 → -3 explodes, 5 survives.
- Asteroid 12 moves right → no collision with 5 because it is behind → 12 survives. Final state: [5, 12]
Input: asteroids = [10, 2, -5]
· 2 <= asteroids.length <= 105 · -106 <= asteroids[i] <= 106 · asteroids[i] != 0
cpp
class Solution{
public:
vector<int> asteroidCollision(vector<int> &asteroids){
}
};java
class Solution {
public int[] asteroidCollision(int[] asteroids) {
}
}python
class Solution:
def asteroidCollision(self, asteroids):javascript
class Solution {
asteroidCollision(asteroids) {
}
}csharp
public class Solution
{
public List<int> AsteroidCollision(List<int> asteroids)
{
}
}go
func asteroidCollision(asteroids []int) []int {
}Stuck? Show a way to structure it+
- 01Use a stack to store asteroids that have survived everything processed so far.
- 02A collision is possible only when the stack top is positive and the current asteroid is negative.
- 03Resolve smaller, equal, and larger absolute-size cases until the current asteroid is destroyed or safe.
- 04Append the current asteroid only if it survives the entire collision loop.
Reference answer
Then expect these follow-ups
Why is the solution O(n) despite the nested while loop?
Tests: amortized analysis
Which sign ordering is the only one that can produce a collision?
Tests: case analysis
Hiring now
Qualcomm has 707 open roles right now
landed applies to roles like these for you, on each company’s own site, with answers written for the role.
Embedded Software Engineer, Senior
San Diego, California, United States of America
Graphics Software Engineer, Staff
San Diego, California, United States of America
Staff Software Engineer
San Diego, California, United States of America
Next question