给定一个整数数组 asteroids,表示在同一行的行星。对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。[题目地址]
对题目进行简单分析后发现,行星碰撞是具有延续性质的,换句话说,当相邻的两个行星发生碰撞后,其中的一个行星会消失,继续存在的行星若和新的相邻行星也符合碰撞条件,则能继续地进行碰撞。另外,还可以发现,不论以从左到右或是从右到左,或是其他顺序。只要星星之间的相对位置不变,其最终结果不变。这样两个特点,很自然想到用使用栈作为基本的数据结构,并模拟其碰撞的规则。
public int[] asteroidCollision(int[] asteroids) { Deque<Integer> stack = new ArrayDeque(); //check every aster from left to right for(int aster : asteroids){ boolean addNewAster = true; //keep check until this aster is dead or there is no collision to happen while(addNewAster && !stack.isEmpty() && stack.peekLast() > 0 && aster < 0){ int lastAster = stack.peekLast(), copyAster = -aster; if(lastAster <= copyAster) stack.pollLast(); if(lastAster >= copyAster) addNewAster = false; } if(addNewAster) stack.addLast(aster); } int[] rtn = new int[stack.size()]; for(int i = 0; i < rtn.length ; i++){ rtn[i] = stack.pollFirst(); } return rtn; }