力扣题库刷题笔记735-行星碰撞

1、题目如下:

力扣题库刷题笔记735-行星碰撞_第1张图片

2、个人Python代码实现

力扣题库刷题笔记735-行星碰撞_第2张图片

         个人代码思路,主要是新建一个列表stack,将原列表asteroids中的元素依次加入到stack中。以上代码可能会有两部分比较冗余的部分,一是两个标志位可以不用单独声明,二是当stack列表中的最后一个元素为负数的时候,无论asteroids中的下一个元素是正数还是负数,都是直接加入到stack中。

        个人代码如下:

class Solution:

    def asteroidCollision(self, asteroids: List[int]) -> List[int]:

        stack = []                                          #声明一个空列表用于输出结果

        flag1 = 1                                           #标志位1,用于判断stack最后一个元素是否为正数

        flag2 = 1                                           #标志位2,用于判断asteroids第一个元素是否为正数

        i = 0                                               #下标,用于表示asteroids列表的第一个元素下标

        while len(asteroids) > 0:                           #当asteroids不为空时,循环继续

            if not stack:                                   #当stack不为空的时候,flag1为2

                flag1 = 2

            elif stack[-1] > 0:                             #当stack最后一个元素为正数的时候,flag1为1

                flag1 = 1

            else:                                           #当stack最后一个元素为负数的时候,flag1为0

                flag1 = 0

            if asteroids[i] == 0:                           #当asteroids第一个元素为0时,flag2为2

                flag2 = 2

            elif asteroids[i] > 0:                          #当asteroids第一个元素为正数的时候,flag2为1

                flag2 = 1

            else:                                           #当asteroids第一个元素为负数的时候,flag2为0

                flag2 = 0

            if flag1 == 2:                                  #当stack为空时,将asteroids第一个元素加入stack,并在asteroids中删除该元素

                stack.append(asteroids[i])

                del asteroids[i]

            elif flag1 == 1:                                #当stack最后一个元素为正数时

                if flag2 == 2:                              #当asteroids第一个元素为0时,在asteroids中删除该元素

                    del asteroids[i]

                elif flag2 == 1:                            #当asteroids第一个元素为正数时,将钙元素假如stack,并在asteroids中删除该元素

                    stack.append(asteroids[i])

                    del asteroids[i]

                elif flag2 == 0:                            #当asteroids第一个元素为负数时

                    if stack[-1] + asteroids[i] > 0:        #如果stack最后一个元素和asteroids第一个元素相加为正数,在asteroids中删除第一个元素

                        del  asteroids[i]

                    elif stack[-1] + asteroids[i] == 0:     #如果stack最后一个元素和asteroids第一个元素相加为0,删除这两个元素

                        del asteroids[i]        

                        stack.pop()

                    else:                                   #如果stack最后一个元素和asteroids第一个元素相加为负数,删除stack最后一个元素

                        stack.pop()

            elif flag1 == 0:                                #当stack最后一个元素为负数时,asteroids中的元素直接加入stack中,并唉asteroids中删除他

                if flag2 == 2:

                    del asteroids[i]

                elif flag2 == 1:

                    stack.append(asteroids[i])

                    del asteroids[i]

                elif flag2 == 0:

                    stack.append(asteroids[i])

                    del asteroids[i]

        return stack

3、题解Python代码如下:

力扣题库刷题笔记735-行星碰撞_第3张图片

        题解代码简洁很多,需要稍微调试才能理解,但是个人很难单独写出来,仅作为对比,表示个人代码长度。

        题解代码如下:

asteroids = [5, 10, -15, 6]
st = []
for aster in asteroids:
alive = True #每个asteroids列表中的元素初始化标志位都为True
#当且仅当标志位为True,当前元素asteroid为负数,st列表不为空且st最后一个元素为正数时,进入循环
while alive and aster < 0 and st and st[-1] > 0:
#当asteroid为负数且绝对值小于st最后一个元素时(即两数之和也为负数),标志位为True,否则为False
alive = st[-1] < -aster
#当两数之和为负数时,移除st最后一个元素
if st[-1] <= -aster:
st.pop()
if alive:
st.append(aster)
print(st)

 

 

 

你可能感兴趣的:(力扣,leetcode,笔记,算法)