735. 行星碰撞 2020/10/20

给定一个整数数组 asteroids,表示在同一行的行星。

对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。

找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

链接:https://leetcode-cn.com/problems/asteroid-collision

首先,看到这样的数组,应该先想能不能排序,发现排序对这道题没有意义,就放弃排序,换思路。这道题的重点在要拿出前一个值和现在的值作比较,那么自然而然地想到栈的做法。
思考的过程是:
1.若当前asteroids值为正,那么直接进temp,因为它一定不会和前面的行星发生碰撞。
2.若当前的asteroids值为负,那么就要考虑temp中最后一个值与他的比较了,分为五种情况
① temp是空的,那么把当前值放入temp即可,break出循环
② temp非空,但是最后的值为负数,那么也放入temp即可,因为不会相撞,break出循环
③ temp非空,但是最后的值为正数,且绝对值大于当前asteroids值,那么相撞之后当前asteroids值消失,break出循环
④ temp非空,但是最后的值为正数,且绝对值小于当前asteroids值,那么相撞之后temp的最后值消失,继续循环
⑤ temp非空,但是最后的值为正数,且绝对值等于当前asteroids值,那么相撞之后当前asteroids值消失temp的最后的值也消失,break出循环

class Solution:
    def asteroidCollision(self, asteroids: List[int]) -> List[int]:
        temp = []  # vector
        count = -1  # 指针,作vector
        for i in range(len(asteroids)):
            if asteroids[i] > 0:
                temp.append(asteroids[i])
                count += 1
            else:
                if count < 0 or temp[count] < 0:
                    temp.append(asteroids[i])
                    count += 1
                    continue
                while (count > -1 and temp[count] > 0):
                    if asteroids[i] + temp[count] < 0:
                        del temp[count]
                        count -= 1
                        if count < 0 or temp[count] < 0:
                            temp.append(asteroids[i])
                            count += 1
                            break
                    elif asteroids[i] + temp[count] > 0:
                        break
                    else:
                        del temp[count]
                        count -= 1
                        break
        return temp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值