735. Asteroid Collision

1. Description

We are given an array asteroids of integers representing asteroids in a row.
For each asteroid, the absolute value represents its size, and the sign represents its direction (positive meaning right, negative meaning left). Each asteroid moves at the same speed.
Find out the state of the asteroids after all collisions. If two asteroids meet, the smaller one will explode. If both are the same size, both will explode. Two asteroids moving in the same direction will never meet.

2. Example

Example 1:
Input: asteroids = [5,10,-5]
Output: [5,10]
Explanation: The 10 and -5 collide resulting in 10. The 5 and 10 never collide.

Example 2:
Input: asteroids = [8,-8]
Output: []
Explanation: The 8 and -8 collide exploding each other.

Example 3:
Input: asteroids = [10,2,-5]
Output: [10]
Explanation: The 2 and -5 collide resulting in -5. The 10 and -5 collide resulting in 10.

Example 4:
Input: asteroids = [-2,-1,1,2]
Output: [-2,-1,1,2]
Explanation: The -2 and -1 are moving left, while the 1 and 2 are moving right. Asteroids moving the same direction never meet, so no asteroids will meet each other.

3. Constraints

  • 1 <= asteroids <= $10^4$
  • -1000 <= asteroids[i] <= 1000
  • asteroids[i] != 0

4. Solutions

My Accepted Solution

n = m_asteroids.size()
Time complexity: O(n)
Space complexity: O(n)

class Solution 
{
public:
    // vector<int> asteroidCollision(vector<int>& asteroids)
    vector<int> asteroidCollision(vector<int> &m_asteroids) 
    {
        vector<int> result; // vector could also push and pop at the end, like stack, so we use vector as stack, then return the result
        
        for(int i = 0; i < m_asteroids.size(); i++)
        {
            // if the stack is empty, the first asteroid must be valid
            // if two asteroids have the same direction, they will never collide
            // if two asteroids back to each other, they will never collide 
            // so the only condition of collision is current asteroids move right while the comming asteroide moves left
            if(!result.empty() && result.back() > 0 && m_asteroids[i] < 0)
            {
                // the comming asteroid must be negative
                // so we need to check whether the current ont is positive to meet the conditon of collision
                while(!result.empty() && result.back() > 0) 
                {
                    if(result.back() + m_asteroids[i] < 0) // the current asteroid is smaller, it will explode
                    {
                        result.pop_back();
                    }
                    else if(result.back() + m_asteroids[i] == 0) // they have the same size, both of them will explode
                    {
                        result.pop_back();
                        m_asteroids[i] = 0;
                        break;
                    }
                    else if(result.back() + m_asteroids[i] > 0) // the current one is bigger, it will beat the comming one
                    {
                        m_asteroids[i] = 0;
                        break;
                    }
                }
                
                // the comming one beat all existing asteroids, we should put it into the result
                if(m_asteroids[i] != 0) result.push_back(m_asteroids[i]);
            }
            else
            {
                result.push_back(m_asteroids[i]); 
            }
        }
        
        return result;
    }
};
Last updated:
Tags: Stack
comments powered by Disqus