国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現時間o(1)的最小棧的實例代碼

2020-01-04 14:43:19
字體:
來源:轉載
供稿:網友

這是畢業校招二面時遇到的手寫編程題,當時剛剛開始學習python,整個棧寫下來也是費了不少時間。畢竟語言只是工具,只要想清楚實現,使用任何語言都能快速的寫出來。

何為最小棧?棧最基礎的操作是壓棧(push)和退棧(pop),現在需要增加一個返回棧內最小值的函數(get_min),要求get_min函數的時間復雜度為o(1)。python的棧肯定是使用list實現,只要將list的append和pop封裝到stack類中,即實現了壓棧和退棧。如果不考慮時間復雜度,我們第一反應一定是min(),min()可以在不開辟新空間的情況下o(n)的返回棧內最小值。但是如果棧內元素很多,并且get_min方法需要頻繁調用時,min高耗時的缺點就被放大,那么理想的方法就是空間換時間來降低時間復雜度。

我們的棧內存在stack_list和min_list,min_list負責存儲棧內元素中最小值組成的棧,當新壓棧的元素小于等于棧內最小的元素時,將新元素壓入min_list。如果退棧的元素等于棧內最小的元素,那么也要將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代碼的完整實現

#!/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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 运城市| 张家界市| 兴宁市| 年辖:市辖区| 台东市| 张家口市| 葫芦岛市| 闽清县| 临漳县| 汝州市| 洪雅县| 靖宇县| 兰溪市| 秦皇岛市| 南开区| 汽车| 兴业县| 黑山县| 宜君县| 怀集县| 安泽县| 柳江县| 四会市| 德阳市| 孟连| 宁德市| 陆良县| 墨玉县| 长治县| 东台市| 衡阳县| 东明县| 庆元县| 永胜县| 灵山县| 临泽县| 沙湾县| 宿州市| 洞口县| 南汇区| 和田市|