给定一个数组,数组中的数表示行星的大小,符号表示方向,负号表示向左飞行,正号表示向右飞行,相撞时大的留下小的消失,一样大则都消失,求最后的结果。
思路:
example 中有三个数,可以想到先固定第一个数,然后把第二个数加进来,然后判断是否碰撞,判断碰撞后保留哪个,很容易联想到栈的入栈和出栈操作,所以用栈来解决这道题。
举个例子,比如当前堆栈里有[5,4,3,2,1],现在来了一个-4,很显然,栈顶的元素要出栈,因为1和-4碰撞后保留-4,但此时-4不能入栈,因为新的栈顶元素还是会和-4发生碰撞,所以我们要在外层遍历的for循环内部再嵌套一个while循环来寻找当前将要入栈的元素的稳定状态,即是否入栈,入栈后也不会再发生碰撞。
AC代码
class Solution:
def asteroidCollision(self, asteroids):
"""
:type asteroids: List[int]
:rtype: List[int]
"""
stack = []
for curr in asteroids:
while(True):
if len(stack)==0:
stack.append(curr)
break
if stack[-1] * curr >0:
stack.append(curr)
break
else:
if stack[-1] < 0 and curr>0:
stack.append(curr)
break
else:
if abs(stack[-1]) == abs(curr):
stack.pop()
break
elif abs(stack[-1]) > abs(curr):
break
else:
stack.pop()
return stack
优化下代码
class Solution:
def asteroidCollision(self, asteroids):
"""
:type asteroids: List[int]
:rtype: List[int]
"""
stack = []
for elem in asteroids:
while(True):
if elem >0 or len(stack) ==0 or stack[-1] <0:
stack.append(elem)
break
else:
if stack[-1] > -elem:
break
elif stack[-1] == -elem:
stack.pop()
break
else:
stack.pop()
return stack