[LeetCode] 735. Asteroid Collision

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 735. Asteroid Collision相关的知识,希望对你有一定的参考价值。

行星碰撞。

题意是给一个数组 asteroids,表示在同一行的行星。对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。找出碰撞后剩下的所有行星。

碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。例子,

Example 1:

Input: 
asteroids = [5, 10, -5]
Output: [5, 10]
Explanation: 
The 10 and -5 collide resulting in 10.  The 5 and 10 never collide.

 

Example 2:

Input: 
asteroids = [8, -8]
Output: []
Explanation: 
The 8 and -8 collide exploding each other.

 

Example 3:

Input: 
asteroids = [10, 2, -5]
Output: [10]
Explanation: 
The 2 and -5 collide resulting in -5.  The 10 and -5 collide resulting in 10.

 

Example 4:

Input: 
asteroids = [-2, -1, 1, 2]
Output: [-2, -1, 1, 2]
Explanation: 
The -2 and -1 are moving left, while the 1 and 2 are moving right.
Asteroids moving the same direction never meet, so no asteroids will meet each other.

思路是用stack做。先创建一个空的stack,一开始当stack为空的时候,直接就把数组里面的元素加进去;当stack不为空的时候,做如下判断

1. 先看一下栈顶元素的正负和要塞入的元素的正负。如果栈顶元素为负(往左)或者要塞入的元素为正(往右),说明加入栈的时候不会发生碰撞,直接就加了;

2. 除了第一种情况,其他情况就有可能会发生碰撞了。这时候判断如果栈顶元素 + 塞入元素 < 0说明两者会相向碰撞并且栈顶元素会被损毁,此时要pop出栈顶元素并且i--,看看试图加入栈的元素能否把新的栈顶元素(原来是在i - 1的位置上的元素)再次损毁

3. 如果两者相向碰撞但是速度一样,两者互相抵消,栈顶元素直接pop

时间O(n)

空间O(n)

 1 /**
 2  * @param {number[]} asteroids
 3  * @return {number[]}
 4  */
 5 var asteroidCollision = function (asteroids) {
 6     const stack = [];
 7     const len = asteroids.length;
 8     for (let i = 0; i < len; i++) {
 9         const cur = asteroids[i];
10         // if stack is empty, just push
11         if (!stack.length) {
12             stack.push(cur);
13         } else {
14             // peek the stack top
15             const pop = stack[stack.length - 1];
16             if (pop < 0 || cur > 0) {
17                 stack.push(cur);
18             } else if (pop + cur < 0) {
19                 stack.pop();
20                 i--;
21             } else if (pop + cur === 0) {
22                 stack.pop();
23             }
24         }
25     }
26     return stack;
27 };

 

以上是关于[LeetCode] 735. Asteroid Collision的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 735. Asteroid Collision

735. Asteroid Collision

[LeetCode] Asteroid Collision 行星碰撞

LeetCode 0735.行星碰撞:两种方法(方法二是方法一的优化)

LeetCode——735.行星碰撞

LeetCode 735 行星碰撞[栈 模拟] HERODING的LeetCode之路