题目描述
给定一个整数数组 asteroids
,表示在同一行的小行星。数组中小行星的索引表示它们在空间中的相对位置。
对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。
找出碰撞后剩下的所有小行星。碰撞规则:两个小行星相互碰撞,较小的小行星会爆炸。如果两颗小行星大小相同,则两颗小行星都会爆炸。两颗移动方向相同的小行星,永远不会发生碰撞。
示例 1:
|
|
示例 2:
|
|
示例 3:
|
|
提示:
2 <= asteroids.length <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0
题解
- 碰撞条件
只有当:
- 当前小行星向左(
aster < 0
) - 栈顶小行星向右(
st.back() > 0
) - 栈不为空时才会发生碰撞。
- 当前小行星向左(
- 碰撞处理
- 如果栈顶小行星的绝对值小于当前小行星(
st.back() < -aster
),栈顶小行星爆炸,当前小行星还活着(alive = true
),继续和下一个栈顶比较。 - 如果栈顶小行星的绝对值等于当前小行星(
st.back() == -aster
),两者都爆炸(alive = false
),栈顶弹出。 - 如果栈顶小行星的绝对值大于当前小行星(
st.back() > -aster
),当前小行星爆炸(alive = false
),栈顶不变。
- 如果栈顶小行星的绝对值小于当前小行星(
- 存活判断
如果当前小行星在碰撞后还活着(
alive == true
),就入栈。
|
|