携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
2 <= asteroids.length <= 104-1000 <= asteroids[i] <= 1000asteroids[i] != 0
二、思路分析:
我们读取本题题目,题目要求求出未碰撞的行星,碰撞的行星的规则是怎么样,我们继续对题目中细节进行审题:
- 行星🪐分为两种:正行星和负行星
- 正行星🪐:往右边移动
- 负行星🪐:往左边移动
- 当正行星与负行星相遇时,正行星较大时则负行星爆炸💥;正行星与负行星相等时,两个行星都爆炸💥
根据上述规则,我们可以使用模拟方法,解答该题思路如下:
- 两个行星是同一个方向时,则不会发生碰撞💥
- 两个行星是反方向时,也不回发生碰撞💥
- 只有当负行星前面是正信息,则会发生碰撞
因此我们可以定义两个临时列表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提交记录如下:
- 时间复杂度:O(n),n为行星列表中的行星数量
- 空间复杂度:O(n),需要使用额外的列表来模拟栈
以上是本期内容,欢迎大佬们点赞评论,下期见~~