剑指 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; } }