剑指 Offer II 037. 小行星碰撞(735. 行星碰撞)

题目:

 

 

思路:

【1】这题重点在于理解题目,首先所谓的行星只是形容,它们所处的环境不是一个圆,而是在一个平行的坐标轴上,那么对于负数是向坐标轴的左边走,正数是向右边走,而他们的下标可以看做是位置在坐标轴上的起始位置。这么说完,大概有一个整体的思路,那么要发生碰撞,必然要先有一个往右边走的正数,然后右边还要有一个向左走的负数。

代码展示:

//时间2 ms击败94.78%
//内存42.4 MB击败54.64%
//时间复杂度:O(n),其中 n 为数组 asteroids 的大小。
//空间复杂度:O(1)。返回值不计入空间复杂度。
class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        LinkedList<Integer> queue = new LinkedList<>();

        for (int aster : asteroids){
            boolean alive = true;
            while (alive && aster < 0 && !queue.isEmpty() && queue.peekLast() > 0) {
                alive = queue.peekLast() < -aster; // aster 是否存在
                if (queue.peekLast() <= -aster) {  // 栈顶行星爆炸
                    queue.pollLast();
                }
            }
            //如果存活下来,就放入列表
            if (alive) queue.add(aster);
        }

        int[] ans = new int[queue.size()];
        for (int i = queue.size() - 1; i >= 0; i--) {
            ans[i] = queue.pollLast();
        }
        return ans;
    }
}

 

posted @ 2023-03-21 12:19  忧愁的chafry  阅读(15)  评论(0编辑  收藏  举报