数组asteroids里面的数字是小行星的size, 正负号表示小行星运动的方向,+表示向右,-表示向左。
+向和-向的小行星会发生碰撞,撞了以后留下大的,小的会消失,size一样大时两个都会消失。
求剩下的小行星。
思路:
你会好奇为什么example中都是正数在前负数在后,
为什么不能是[-5, 5, 10]这样的负数在前。
因为只有正数在左边负数在右边才会发生碰撞。
[-5, 5, 10]这种,左边的向左运动,右边的向右运动,那么它们不会相遇。
所以只需要解决正数在左,负数在右的这种情况。
用一个stack保存至今为止出现的正数,当遇到负数时,判断谁的size大,
如果负数的size大,当前正数消失,取下一正数,直到size比负数的size大。
如果正数size大,当前负数消失,取数组下一数字。
正数直接进栈。
如果当前栈顶为负数,下面一个数字直接进栈(正的不会相遇,负的同向不会碰撞)。
最后返回stack中的元素。
public int[] asteroidCollision(int[] asteroids) {
Stack<Integer> st = new Stack<>();
for(int as : asteroids) {
if(st.empty() || as > 0) st.push(as);
else{
while(!st.empty() && st.peek() > 0 && (Math.abs(as) > st.peek())) {
st.pop();
}
if(!st.empty() && (-as == st.peek())) st.pop();
else if(st.empty() || st.peek() < 0) st.push(as);
}
}
int[] res = new int[st.size()];
for(int i = st.size()-1; i >= 0; i--) res[i] = st.pop();
return res;
}