题目描述
方法及思路
- 方法:线模拟
- 思路:
负数是向左走,正数是向右走
,也就是说如果负数再最左边或者正数再最右边就不会发生碰撞。- 从头遍历数组,若当前元素向左走且栈顶元素向右走,则
当前遍历元素和栈顶元素对比(模拟碰撞情况)
,否则为不发生爆炸则入栈res。 - 爆炸的情况有:①遍历的当前元素爆炸(标记已爆炸,跳出碰撞情况模拟(while循环))②栈顶元素爆炸(爆炸则出栈)
JS代码
/**
* @param {number[]} a
* @return {number[]}
*/
var asteroidCollision = function(a) {
let res = [];
for(let i=0;i<a.length;i++){
let isSafe = true;
while(isSafe&&a[i]<0&&res.length!=0&&res[res.length-1]>0){
isSafe = res[res.length-1]<-a[i]; //判断当前小行星是否存活
if(res[res.length-1]<=-a[i]) //判断栈顶小行星是否爆炸
res.pop();
}
if(isSafe)
res.push(a[i]);
}
return res;
};