735. Asteroid Collision
题目简介
/**
* @param {number[]} asteroids
* @return {number[]}
*/
题目给我们一个数字数组表示一群行星,数组元素代表行星的大小,正负值代表行星前进方向,每个行星前进速度一致
如果大行星碰到小行星,则小行星消失、如果两个相同大小的碰撞则都消失
要求我们最后计算出来剩下的元素有哪些
解题思路
这题需要用到栈来求解,用一个栈 stack 来维护当前的行星
我们正常遍历数组,有三种情况我们可以直接入栈:
- 当前栈为空
- 当前栈顶是负的
- 当前遍历元素是正的
接下来我们需要考虑栈顶为正且当前遍历元素为负的情况,一共有三种:
stack[stack.length - 1] > -asteroids[i]:栈顶比当前行星大,不需要做什么操作继续遍历stack[stack.length - 1] < -asteroids[i]:栈顶比当前行星小,需要出栈并且重新遍历当前行星一次stack[stack.length - 1] === -asteroids[i]:两个同体积行星碰撞,都消失,直接出栈当前栈顶即可
最后返回该栈即可
Javascript
/**
* @param {number[]} asteroids
* @return {number[]}
*/
var asteroidCollision = function (asteroids) {
const stack = []
for (let i = 0; i < asteroids.length; i++) {
const top = stack[stack.length - 1]
const cur = asteroids[i]
if(top === undefined || top < 0 || cur > 0 ) {
stack.push(cur)
} else if(-cur === top) {
stack.pop()
} else if(top < -cur){
stack.pop()
// check this asteroid again
i--
}
}
return stack
};