【leetcode】735. Asteroid CollisionI 解题报告
给定一个数组,数组中的数表示行星的大小,符号表示方向,负号表示向左飞行,正号表示向右飞行,相撞时大的留下小的消失,一样大则都消失,求最后的结果。
思路:
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

相关文章:

  • 2021-08-12
  • 2021-11-29
  • 2021-09-02
  • 2021-12-28
  • 2021-10-30
  • 2021-08-14
  • 2022-02-26
  • 2022-02-27
猜你喜欢
  • 2021-11-17
  • 2021-06-03
  • 2022-12-23
  • 2021-08-09
  • 2021-12-01
  • 2021-07-17
  • 2021-05-26
相关资源
相似解决方案