Asteroid Collision

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.

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.

Solution: Using Vector

  • We can just use vector instead of stack
  • Iterate through the input vector
  • Use while loop to check if the asteroid will collide with the previous one
  • If the two asteroids are of the same size, we pop the previous one and set current asteroid size to 0
  • If asteroid moving left is larger, we pop the previous one
  • If asteroid moving right is larger, we set asteroid size to 0
  • After the while loop, if the asteroid is not zero, we push it back
    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int> ans;
        for (auto ast: asteroids) {
            while (!ans.empty() && ans.back() > 0 && ast < 0) {
                if (ans.back() == -ast) {
                    ans.pop_back(); ast = 0;
                } else if (ans.back() < -ast) {
                    ans.pop_back();
                } else {
                    ast = 0;
                }
            }

            if (ast) ans.push_back(ast);
        }

        return ans;
    }

Solution: Using Stack

    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int> res;
        for (int i = 0; i < asteroids.size(); ++i) {
            if (asteroids[i] > 0) {
                // If asteroid is moving right, push back.
                // Because -1, 1 will never collide with each other
                res.push_back(asteroids[i]);
            } else if (res.empty() || res.back() < 0) {
                // If asteroid is moving left, and previous is also moving left
                // Both asteroids are moving left
                res.push_back(asteroids[i]);
            } else if (res.back() <= -asteroids[i]) {
                // If asteroid is moving left, and previous is moving right
                if (res.back() < -asteroids[i]) --i;
                res.pop_back();
            }
        }
        return res;
    }

results matching ""

    No results matching ""