思路
- 使用栈进行相碰检测
- 正数直接入栈,负数判断相撞还是不相撞
- 复数相撞分为三种情况,一种是不断消灭,一种是遇到对手,还有一种是被打败了
- 不断消灭也会分为三种情况,其中战胜到底就push 遇到对手就pop 被打败不做处理
代码1
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
stack<int> starlist;
vector<int> ans;
for(int i:asteroids){
//向右行星入栈
if(i>0)
starlist.push(i);
//向左行星看是否碰撞
if(i<0){
//相碰
if(!starlist.empty()&&starlist.top()>0){
if (abs(i) > starlist.top()) {//大于
while (!starlist.empty() && starlist.top() > 0 && abs(i) > starlist.top())
starlist.pop();
if (starlist.empty() || starlist.top() < 0)//战胜到底
starlist.push(i);
else if(starlist.top() == abs(i))//遇到对手了
starlist.pop();
//被打败不作处理
}
else if (abs(i) == starlist.top()) {//等于
starlist.pop();
}
//小于不作处理
}
//不相碰
else{
starlist.push(i);
}
}
}
//栈转向量
while(!starlist.empty()){
ans.push_back(starlist.top());
starlist.pop();
}
reverse(ans.begin(),ans.end());
return ans;
}
};
代码2(使用向量代替栈更高效)
(v.erase(v.end()-1))
相当于 v.pop_back()
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
vector<int> starlist;
for (int i : asteroids) {
//向右行星入栈
if (i > 0)
starlist.push_back(i);
//向左行星看是否碰撞
else {
//相碰
if (!starlist.empty() && starlist.back() > 0) {
if (abs(i) > starlist.back()) {//大于
while (!starlist.empty() && starlist.back() > 0 && abs(i) > starlist.back())
starlist.erase(starlist.end()-1);
if (starlist.empty() || starlist.back() < 0)//战胜到底
starlist.push_back(i);
else if (starlist.back() == abs(i))//遇到对手了
starlist.erase(starlist.end()-1);
}
else if (abs(i) == starlist.back()) {//等于
starlist.erase(starlist.end()-1);
}
//小于不作处理
}
//不相碰
else {
starlist.push_back(i);
}
}
}
return starlist;
}
};