python實(shí)現(xiàn)時間o(1)的最小棧的實(shí)例代碼
這是畢業(yè)校招二面時遇到的手寫編程題,當(dāng)時剛剛開始學(xué)習(xí)python,整個棧寫下來也是費(fèi)了不少時間。畢竟語言只是工具,只要想清楚實(shí)現(xiàn),使用任何語言都能快速的寫出來。
何為最小棧?棧最基礎(chǔ)的操作是壓棧(push)和退棧(pop),現(xiàn)在需要增加一個返回棧內(nèi)最小值的函數(shù)(get_min),要求get_min函數(shù)的時間復(fù)雜度為o(1)。python的??隙ㄊ鞘褂胠ist實(shí)現(xiàn),只要將list的append和pop封裝到stack類中,即實(shí)現(xiàn)了壓棧和退棧。如果不考慮時間復(fù)雜度,我們第一反應(yīng)一定是min(),min()可以在不開辟新空間的情況下o(n)的返回棧內(nèi)最小值。但是如果棧內(nèi)元素很多,并且get_min方法需要頻繁調(diào)用時,min高耗時的缺點(diǎn)就被放大,那么理想的方法就是空間換時間來降低時間復(fù)雜度。
我們的棧內(nèi)存在stack_list和min_list,min_list負(fù)責(zé)存儲棧內(nèi)元素中最小值組成的棧,當(dāng)新壓棧的元素小于等于棧內(nèi)最小的元素時,將新元素壓入min_list。如果退棧的元素等于棧內(nèi)最小的元素,那么也要將min_list退棧。舉例子,我們依次壓棧3,2,4,1
初始化
stack_list = [] min_list = []
3壓棧
stack_list = [3] min_list = [3]
2壓棧
stack_list = [3, 2] min_list = [3, 2]
4壓棧
stack_list = [3, 2, 4] min_list = [3, 2]
1壓棧
stack_list = [3, 2, 4, 1] min_list = [3, 2, 1]
get_min只需要返回min_list中最后一個元素,以下是python代碼的完整實(shí)現(xiàn)
#!/usr/bin/python # -*- coding: utf-8 -*- class stack(object): stack_list = [] min_list = [] min = None def push(self, x): if not self.stack_list: self.min = x self.min_list.append(self.min) self.stack_list.append(x) return self.stack_list.append(x) if self.min >= x: self.min = x self.min_list.append(self.min) return def pop(self): pop_result = None if self.stack_list: pop_result = self.stack_list[-1] if self.stack_list.pop() == self.min: self.min_list.pop() if self.min_list: self.min = self.min_list[-1] else: self.min = None return pop_result else: self.min = None return pop_result def print_stack(self): print "stack---->", self.stack_list return def get_min(self): return self.min
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python基于列表模擬堆棧和隊列功能示例
- Python實(shí)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)中棧的操作示例
- Python數(shù)據(jù)結(jié)構(gòu)之棧、隊列的實(shí)現(xiàn)代碼分享
- Python棧算法的實(shí)現(xiàn)與簡單應(yīng)用示例
- Python算法應(yīng)用實(shí)戰(zhàn)之棧詳解
- Python 數(shù)據(jù)結(jié)構(gòu)之堆棧實(shí)例代碼
- 如何用C語言、Python實(shí)現(xiàn)棧及典型應(yīng)用
- Python實(shí)現(xiàn)包含min函數(shù)的棧
- Python棧類實(shí)例分析
- Python實(shí)現(xiàn)棧的方法
相關(guān)文章
django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹
這篇文章主要介紹了django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python 發(fā)送和接收ActiveMQ消息的實(shí)例
今天小編就為大家分享一篇python 發(fā)送和接收ActiveMQ消息的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01詳解Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等)
激活函數(shù) (Activation functions) 對于人工神經(jīng)網(wǎng)絡(luò)模型去學(xué)習(xí)、理解非常復(fù)雜和非線性的函數(shù)來說具有十分重要的作用,這篇文章主要介紹了Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等),需要的朋友可以參考下2023-04-04Python 迭代,for...in遍歷,迭代原理與應(yīng)用示例
這篇文章主要介紹了Python 迭代,for...in遍歷,迭代原理與應(yīng)用,結(jié)合實(shí)例形式分析了Python迭代與遍歷的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-10-10