暂无分类
暂无标签
发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2019 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系z452as@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!