+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-07(1)

2019-08(109)

2019-09(120)

2019-10(17)

2019-11(1)

LeetCode:735.行星碰撞

发布于2020-06-13 18:01     阅读(426)     评论(0)     点赞(14)     收藏(4)


0

1

2

3

4

5

6

给定一个整数数组 asteroids,表示在同一行的行星。
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
示例 1:
输入:
asteroids = [5, 10, -5]
输出: [5, 10]
解释:
10 和 -5 碰撞后只剩下 10。 5 和 10 永远不会发生碰撞。
示例 2:
输入:
asteroids = [8, -8]
输出: []
解释:
8 和 -8 碰撞后,两者都发生爆炸。
示例 3:
输入:
asteroids = [10, 2, -5]
输出: [10]
解释:
2 和 -5 发生碰撞后剩下 -5。10 和 -5 发生碰撞后剩下 10。
示例 4:
输入:
asteroids = [-2, -1, 1, 2]
输出: [-2, -1, 1, 2]
解释:
-2 和 -1 向左移动,而 1 和 2 向右移动。
由于移动方向相同的行星不会发生碰撞,所以最终没有行星发生碰撞。
说明:
数组 asteroids 的长度不超过 10000。
每一颗行星的大小都是非零整数,范围是 [-1000, 1000] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/asteroid-collision

class Solution:
    def asteroidCollision(self, asteroids: List[int]) -> List[int]:
        '''利用栈的原理'''
        ans = []                                    # 构造一个栈
        for v in asteroids:
            if not ans or v > 0:
                '''不会发生碰撞,入栈'''
                ans.append(v)
            else:
                if ans[-1] < 0:
                    '''不发生碰撞,入栈'''
                    ans.append(v)
                else:
                    '''发生了碰撞,三种情况'''
                    if -v < ans[-1]:
                        # v太小,被撞没
                        continue
                    elif -v == ans[-1]:
                        # 同归于尽
                        ans.pop()
                    else:
                        # v大了
                        ans[-1] = v             # v替代栈顶元素
                        n = len(ans)-2
                        while n >= 0:
                            '''需要和剩下的栈内元素比较'''
                            if ans[n] < 0:
                                # 同方向
                                break
                            else:
                                # 不同方向
                                if ans[n] > -ans[-1]:
                                    # 栈顶小,出栈,不用继续比较
                                    ans.pop()
                                    break
                                elif ans[n] == -ans[-1]:
                                    # 同归于尽,两次出栈,不用继续比较
                                    ans.pop()
                                    ans.pop()
                                    break
                                else:
                                    # 继续比较,替换,出栈
                                    ans[n] = ans[-1]
                                    ans.pop()
                            n -= 1
        return ans

关键要注意各种临界条件

原文链接:https://blog.csdn.net/qq_44630682/article/details/106699112

0

1

2

3

4



所属网站分类: 技术文章 > 博客

作者:你太美丽

链接: https://www.pythonheidong.com/blog/article/414836/ba85af925959758b0396/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)