[LC735]行星碰撞

题目描述

给定一个整数数组 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;
    }

</=></integer>

Original: https://www.cnblogs.com/xy1997/p/16476131.html
Author: xingyuanyuan
Title: [LC735]行星碰撞

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588096/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球