日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

735. 行星碰撞

發(fā)布時(shí)間:2025/1/21 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 735. 行星碰撞 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

735. 行星碰撞

給定一個(gè)整數(shù)數(shù)組 asteroids,表示在同一行的行星。

對(duì)于數(shù)組中的每一個(gè)元素,其絕對(duì)值表示行星的大小,正負(fù)表示行星的移動(dòng)方向(正表示向右移動(dòng),負(fù)表示向左移動(dòng))。每一顆行星以相同的速度移動(dòng)。

找出碰撞后剩下的所有行星。碰撞規(guī)則:兩個(gè)行星相互碰撞,較小的行星會(huì)爆炸。如果兩顆行星大小相同,則兩顆行星都會(huì)爆炸。兩顆移動(dòng)方向相同的行星,永遠(yuǎn)不會(huì)發(fā)生碰撞。

示例 1:

輸入:asteroids = [5,10,-5] 輸出:[5,10] 解釋:10 和 -5 碰撞后只剩下 10 。 5 和 10
永遠(yuǎn)不會(huì)發(fā)生碰撞。 示例 2:

輸入:asteroids = [8,-8] 輸出:[] 解釋:8 和 -8 碰撞后,兩者都發(fā)生爆炸。 示例 3:

輸入:asteroids = [10,2,-5] 輸出:[10] 解釋:2 和 -5 發(fā)生碰撞后剩下 -5 。10 和 -5 發(fā)生碰撞后剩下
10 。 示例 4:

輸入:asteroids = [-2,-1,1,2] 輸出:[-2,-1,1,2] 解釋:-2 和 -1 向左移動(dòng),而 1 和 2
向右移動(dòng)。 由于移動(dòng)方向相同的行星不會(huì)發(fā)生碰撞,所以最終沒(méi)有行星發(fā)生碰撞。

來(lái)源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/asteroid-collision
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

題目分析:

遍歷數(shù)組,每次得到的數(shù)字,要么是正數(shù),要么是負(fù)數(shù)。
根據(jù)題意,負(fù)數(shù)是向左走,正數(shù)是向右走。
前后兩次遍歷到的數(shù)字,總共有四種可能,即:

  • +,+ 不會(huì)爆炸
  • +,- 爆炸
  • -,+ 不會(huì)爆炸
  • -,- 不會(huì)爆炸
  • 從上面的分析可以看出,如果前一個(gè)數(shù)是負(fù)數(shù)的話,不可能與后一個(gè)數(shù)發(fā)生爆炸,如果前一個(gè)數(shù)是正數(shù)的話,則會(huì)爆炸,保留誰(shuí),則要看二者之間的大小關(guān)系:

    • 正數(shù)+負(fù)數(shù)=0,兩個(gè)數(shù)都沒(méi)了
    • 正數(shù)+負(fù)數(shù)<0,保留負(fù)數(shù)
    • 正數(shù)+負(fù)數(shù)>0,保留正數(shù)

    程序設(shè)計(jì)

    用棧保存結(jié)果
    遍歷數(shù)組,當(dāng)前遍歷到item

    • 如果item是整數(shù),則保存在棧中
    • 如果是負(fù)數(shù),會(huì)不會(huì)爆炸則與棧頂元素有關(guān)。
    • 步驟一
      • 如果棧是空的,則保存item,
      • 如果棧頂是負(fù)數(shù),不爆炸,item入棧
      • 如果棧頂top是正數(shù),爆炸,
        1)top + item > 0,則不保存item,繼續(xù)下一輪的遍歷
        2)top + item == 0,則不保存item,同時(shí)彈出top,繼續(xù)下一輪的遍歷
        3)top + item < 0, 即top沒(méi)有item的絕對(duì)值大,則需要彈出top, item繼續(xù)與棧頂元素比較,跳到步驟一處進(jìn)行比較。
    '只有正數(shù)才有可以能爆炸' class Solution:def asteroidCollision(self, asteroids):stack = []flag = 0for item in asteroids:if item > 0:# 遍歷到的是正數(shù),直接壓棧,等著被爆炸stack.append(item)else:# 遍歷的是負(fù)數(shù),就要判斷棧頂是不是正數(shù)while stack: if stack[-1] > 0:if stack[-1] + item < 0: # top + item < 0,需要彈出top, item繼續(xù)與棧頂元素比較stack.pop()elif stack[-1] + item == 0:# 不保存`item`,同時(shí)彈出`top`,繼續(xù)下一輪的遍歷stack.pop()breakelse:# `top + item > 0`,則不保存`item`,繼續(xù)下一輪的遍歷breakelse:# stack.append(item)# 棧頂是負(fù)數(shù),不爆炸,`item`入棧,繼續(xù)下一輪的遍歷breakelse:# 棧為空,壓棧stack.append(item)return stackasteroids = [5,10,-5] # asteroids = [8,-8] # asteroids = [10,2,-5] # asteroids = [-2,-1,1,2] # asteroids = [1,-2,-2,-2] # asteroids = [-2,5,8,-9] # asteroids = [-2,-2,1,-2] # # 輸出:[5,10] A = Solution() b = A.asteroidCollision(asteroids) print(b)

    總結(jié)

    以上是生活随笔為你收集整理的735. 行星碰撞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。