【LeetCode】735. 行星碰撞

108 阅读1分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 2 <= asteroids.length <= 104
    • -1000 <= asteroids[i] <= 1000
    • asteroids[i] != 0

二、思路分析:

我们读取本题题目,题目要求求出未碰撞的行星,碰撞的行星的规则是怎么样,我们继续对题目中细节进行审题:

  • 行星🪐分为两种:正行星和负行星
  • 正行星🪐:往右边移动
  • 负行星🪐:往左边移动
  • 当正行星与负行星相遇时,正行星较大时则负行星爆炸💥;正行星与负行星相等时,两个行星都爆炸💥

根据上述规则,我们可以使用模拟方法,解答该题思路如下:

  • 两个行星是同一个方向时,则不会发生碰撞💥
  • 两个行星是反方向时,也不回发生碰撞💥
  • 只有当负行星前面是正信息,则会发生碰撞 image.png

因此我们可以定义两个临时列表right,left来存储正行星和负行星

  • 当行星列表中行星ast大于0时,则添加到right列表
  • 当行星列表中行星-ast大于right列表顶部的ast时,right.pop()
  • 当行星列表中信息-ast与right列表中顶部的ast时,right.pop()
  • 当right为空时,则将负行星🪐添加到left列表中
  • 直到遍历完行星列表,结果返回left+right
    class Solution(object):
        def asteroidCollision(self, asteroids):
            """
            :type asteroids: List[int]
            :rtype: List[int]
            """
            left,right = [],[]
    
            for i,ast in enumerate(asteroids):
    
                if ast > 0 : right.append(ast)
                while right and right[-1] < -ast:
                    right.pop()
                if right and right[-1] == -ast:
                    right.pop()
                elif not right:
                    left.append(ast)
    
            return left+right
    
    

三、总结:

本题考察我们使用栈的思想模拟行星碰撞过程,行星碰撞条件就是正行星小于-ast和正行星与-ast,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为行星列表中的行星数量
  • 空间复杂度:O(n),需要使用额外的列表来模拟栈

以上是本期内容,欢迎大佬们点赞评论,下期见~~