劍指Offer

09 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列

用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列仿吞。隊(duì)列的聲明如下昏滴,請實(shí)現(xiàn)它的兩個(gè)函數(shù) appendTail 和 deleteHead 痴鳄,分別完成在隊(duì)列尾部插入整數(shù)和在隊(duì)列頭部刪除整數(shù)的功能钝的。(若隊(duì)列中沒有元素及塘,deleteHead 操作返回 -1 )

class CQueue:
    def __init__(self):
        self.a = []
        self.b = []

    def appendTail(self, value: int) -> None:
        self.a.append(value)

    def deleteHead(self) -> int:
        if self.b:
            return self.b.pop()
        if not self.a:
            return -1
        while self.a:
            self.b.append(self.a.pop())
        return self.b.pop()

思路:維護(hù)兩個(gè)棧封锉,一個(gè)輸入棧绵跷,一個(gè)刪除棧膘螟。
心得:list.pop()是最后輸入的一個(gè)元素,empty判斷可以直接用list碾局。

30 包含min函數(shù)的棧

定義棧的數(shù)據(jù)結(jié)構(gòu)荆残,請?jiān)谠擃愋椭袑?shí)現(xiàn)一個(gè)能夠得到棧的最小元素的 min 函數(shù)在該棧中,調(diào)用 min净当、push 及 pop 的時(shí)間復(fù)雜度都是 O(1)内斯。

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.a = []
        self.b = []

    def push(self, x: int) -> None:
        self.a.append(x)
        if not self.b or self.b[-1] >= x:
            self.b.append(x)

    def pop(self) -> None:
        if self.a.pop() == self.b[-1]:
            self.b.pop()

    
    def top(self) -> int:
        return self.a[-1]


    def min(self) -> int:
        return self.b[-1]

思想:主要在于最小值的計(jì)算,維護(hù)兩個(gè)棧像啼,一個(gè)存儲所有的元素俘闯,一個(gè)存儲最小的。
注:>=忽冻,因?yàn)楫?dāng)=時(shí)真朗,就被移除,因此push的時(shí)候也要考慮等號的情況僧诚。

32 從上到下打印二叉樹

從上到下打印出二叉樹的每個(gè)節(jié)點(diǎn)遮婶,同一層的節(jié)點(diǎn)按照從左到右的順序打印。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
from queue import Queue
class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        record = Queue()
        result = []
        if not root:
            return result
        record.put(root)
        while not record.empty():
            tmp = record.get()
            result.append(tmp.val)
            if tmp.left:
                record.put(tmp.left)
            if tmp.right:
                record.put(tmp.right)
        return result

思想:創(chuàng)建一個(gè)隊(duì)列湖笨,將新節(jié)點(diǎn)的子節(jié)點(diǎn)不斷放入隊(duì)列中蹭睡,直到隊(duì)列為空。

32 從上到下打印二叉樹 II

從上到下按層打印二叉樹赶么,同一層的節(jié)點(diǎn)按從左到右的順序打印肩豁,每一層打印到一行。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

from queue import Queue
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        result = []
        record = Queue()
        if not root:
            return result
        record.put(root)
        while not record.empty():
            tmp1 = []
            for i in range(record.qsize()):
                tmp = record.get()
                tmp1.append(tmp.val)
                if tmp.left:
                    record.put(tmp.left)
                if tmp.right:
                    record.put(tmp.right)
            result.append(tmp1)
        return result

思想:維護(hù)新的一層的載入節(jié)點(diǎn)辫呻,size只在開始的時(shí)候計(jì)算清钥。

32 從上到下打印二叉樹 III

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        result = []
        record = collections.deque()
        if not root:
            return result
        record.append(root)
        while record:
            tmp = collections.deque()
            for i in range(len(record)):
                tmp1 = record.popleft()
                if len(result)%2:
                    tmp.appendleft(tmp1.val)
                else:
                    tmp.append(tmp1.val)
                if tmp1.left:
                    record.append(tmp1.left)
                if tmp1.right:
                    record.append(tmp1.right)
            result.append(list(tmp))
        return result

思想:保持原有的順序讀數(shù)據(jù),但是將存數(shù)據(jù)的方式設(shè)置為一個(gè)雙向隊(duì)列放闺,以保存數(shù)據(jù)的results作為層數(shù)的隱式指標(biāo)祟昭,用于確定從左往右還是從右往左。
tips:

  • collection.deque()// 雙端隊(duì)列怖侦;
  • appendleft():從右邊往左插入篡悟;append():從左邊往右插入;
  • list(collections.deque())//將queue轉(zhuǎn)化為list匾寝。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搬葬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艳悔,更是在濱河造成了極大的恐慌急凰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜年,死亡現(xiàn)場離奇詭異抡锈,居然都是意外死亡疾忍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門床三,熙熙樓的掌柜王于貴愁眉苦臉地迎上來一罩,“玉大人,你說我怎么就攤上這事撇簿∏芘祝” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵补疑,是天一觀的道長歧沪。 經(jīng)常有香客問我,道長莲组,這世上最難降的妖魔是什么诊胞? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮锹杈,結(jié)果婚禮上撵孤,老公的妹妹穿的比我還像新娘。我一直安慰自己竭望,他們只是感情好邪码,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咬清,像睡著了一般闭专。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旧烧,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天影钉,我揣著相機(jī)與錄音,去河邊找鬼掘剪。 笑死平委,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夺谁。 我是一名探鬼主播廉赔,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匾鸥!你這毒婦竟也來了蜡塌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤扫腺,失蹤者是張志新(化名)和其女友劉穎岗照,沒想到半個(gè)月后村象,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笆环,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攒至,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躁劣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迫吐。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖账忘,靈堂內(nèi)的尸體忽然破棺而出志膀,到底是詐尸還是另有隱情,我是刑警寧澤鳖擒,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布溉浙,位于F島的核電站,受9級特大地震影響蒋荚,放射性物質(zhì)發(fā)生泄漏戳稽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一期升、第九天 我趴在偏房一處隱蔽的房頂上張望惊奇。 院中可真熱鬧,春花似錦播赁、人聲如沸颂郎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乓序。三九已至,卻和暖如春坎背,著一層夾襖步出監(jiān)牢的瞬間竭缝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工沼瘫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抬纸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓耿戚,卻偏偏與公主長得像湿故,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子膜蛔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 下面是我整理的坛猪,劍指Offer前五章所有的題目以及相關(guān)題和拓展題的題目和答案。代碼的話放在github上皂股,您可以下...
    kikido閱讀 1,031評論 0 1
  • 不要使用暴力的方法墅茉,可以學(xué)學(xué)討論里的技巧 二維數(shù)組中的查找 題目:在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同),每一...
    大大大大大大大熊閱讀 2,551評論 0 1
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記,整理的知識點(diǎn)就斤,也是為了防止忘記悍募,尊重勞動成果,轉(zhuǎn)載注明出處哦洋机!如果你也喜歡坠宴,那...
    波波波先森閱讀 4,086評論 0 23
  • 說明: 本文中出現(xiàn)的所有算法題皆來自牛客網(wǎng)-劍指Offer在線編程題绷旗,在此只是作為轉(zhuǎn)載和記錄喜鼓,用于本人學(xué)習(xí)使用,不...
    秋意思寒閱讀 1,150評論 1 1
  • 1.二維數(shù)組的查找 題目描述:在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同)衔肢,每一行都按照從左到右遞增的順序排序庄岖,每一...
    少年夢游計(jì)_3403閱讀 1,158評論 0 1