Skip to content

Latest commit

 

History

History
58 lines (50 loc) · 1.65 KB

asteroid_collission.md

File metadata and controls

58 lines (50 loc) · 1.65 KB

735. Asteroid Collision

  • used vector in place of stack, for debugging purposes.
  • but method is still the same.
  • keep pushing element till no opposite one noticed.
  • if noticed then according to it's absolute value, delete the previously recorded elements.
implementation
class Solution {
    public:
    bool opposite(int a, int b) {
        if (a > 0 and b < 0) return true;
        if (a < 0 and b > 0) return true;
        return false;
    }

    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int> ans;
        for (const auto& i: asteroids) {
            if (ans.empty()) {
                ans.push_back(i);
                continue;
            }

            if (!opposite(i, ans.back())) {
                ans.push_back(i);
            }
            else {
                bool flag = true;
                while (flag and !ans.empty() and opposite(i, ans.back())) {
                    int top = ans.back();
                    ans.pop_back();

                    if (abs(top) == abs(i)) {}
                    else {
                        int mx = max(abs(top), abs(i));
                        if (mx == abs(top)) {
                            ans.push_back(top < 0 ? -1*mx : mx);
                            flag = false;
                        }
                        else {
                            ans.push_back(i < 0 ? -1*mx : mx);
                        }
                    }
                    for (const auto& i: ans) cout << i << ' '; cout << '\n';
                }

            }
        }
        return ans;
    }
};