天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

用PHP解決的一個(gè)棧的面試題

前言

遇到一道面試題,題目大概意思如下:

使用兩個(gè)普通棧實(shí)現(xiàn)一個(gè)特殊棧,使得pop、push、min三個(gè)函數(shù)的都是復(fù)雜度為O(1)的操作,min函數(shù)是獲得當(dāng)前棧的最小值。

初步想法

1.要實(shí)現(xiàn)min函數(shù)為(1)操作,當(dāng)時(shí)第一想法是事先需要算好當(dāng)前最小值,于是會想到用一個(gè)值來保存當(dāng)前棧中最小值元素,然后push和pop操作的時(shí)候維護(hù)這個(gè)值。這樣min,push都是O(1)了,但pop可不是,如果當(dāng)前彈出的是最小值,需要從新尋找當(dāng)前元素的最小值,這個(gè)就不是o(1)了。

2.而且上面方法沒有用到另外一個(gè)棧,于是又想到:在一個(gè)棧中存儲排好序的元素,同樣在push和pop操作中維護(hù)這個(gè)有序堆棧,如圖:

但是這樣的話min操作是O(1),但是push、pop操作因?yàn)橐S護(hù)這個(gè)有序棧,怎么也想不到一個(gè)方法可以O(shè)(1)的復(fù)雜度。

當(dāng)時(shí)覺得肯定是在另一個(gè)棧中緩存最小值信息,但是不知道是因?yàn)闆]吃飯還是怎么地,思維就此僵住了。

正確解法

遇到問題解決不了,感覺心里很不爽,于是吃飯的時(shí)候又開始想怎么充分理由棧的特性,有效的緩存最小值信息,以便min操作使用。

棧操作最大的特性是只能操作棧頂元素,想到那用一個(gè)輔助棧緩存每次棧操作時(shí)的最小值,不是剛剛好。這樣每次pop操作的時(shí)候,兩邊一起彈出就可以;因?yàn)檩o助棧的棧頂元素最當(dāng)前棧中的最小值,push操作是也只需要比較入棧元素和輔助棧棧頂元素就可以。這樣push、pop、min都都O(1)操作了。如圖:

文字可能沒說清楚,上代碼,下面是php的實(shí)現(xiàn),通過數(shù)組來模擬堆棧。

<?php/** * 使用一個(gè)輔助棧,O(1)復(fù)雜度求出棧中的最小數(shù) * @hack 類中通過數(shù)組來模擬堆棧 *  * @author laiwenhui */class strack{  /**   * 數(shù)據(jù)棧,存儲棧數(shù)據(jù);   *   * @var array   */  private $_arrData = array();  /**   * 輔助棧,存儲數(shù)據(jù)組棧中每層的最下值信息;   *   * @var array   */  private $_arrMin = array();  /**   * 棧頂所在單元   *   * @var int   */  private $_top=-1;  /**   * 出棧   * @return bool|int   */  public function pop(){    if ($this->_top === -1){      return false;    }    array_pop($this->_arrMin);    $this->_top--;    return array_pop($this->_arrData);  }  /**   * 入棧   * @param int $element   * @return bool   */  public function push($element){    $element = intval($element);    //如果棧為空,直接入棧    if ($this->_top === -1){      array_push($this->_arrData, $element);      array_push($this->_arrMin, $element);      $this->_top++;      return true;    }    //不為空,判斷入棧的值是否比最小棧棧頂小    $min = $this->_arrMin[$this->_top];    //比較求出最小值    $currentMin = $element < $min ? $element : $min;    //當(dāng)前棧中最小值入棧    array_push($this->_arrMin, $currentMin);    //數(shù)據(jù)入棧    array_push($this->_arrData, $element);    $this->_top++;    return true;  }  /**   * 求當(dāng)前棧空間的最小值   * @return bool|int    */  public function min(){    if ($this->_top === -1){      return false;    }    return $this->_arrMin[$this->_top];  }}

使用如下:
復(fù)制代碼 代碼如下:
$obj = new strack();
$obj->push(12);
$obj->push(56);
$obj->push(23);
$obj->push(89);
$obj->push(4);
var_dump($obj->min());
$obj->pop();
var_dump($obj->min());
$obj->push(8);
var_dump($obj->min());

輸出為:
復(fù)制代碼 代碼如下:
int(4)
int(12)
int(8)

OK,滿足要求。

你是否有其他更好方法實(shí)現(xiàn),如果有,請告訴我^_^

php技術(shù)用PHP解決的一個(gè)棧的面試題,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 韩国演艺圈qvod | 国产一区内射最近更新 | 久久毛片视频 | 91精品免费久久久久久久久 | 把腿张开再深点好爽宝贝 | 中文字幕亚洲欧美日韩2o19 | 久久er国产免费精品 | 老师的脚奴 | HEYZO精品无码一区二区三区 | 色橹橹欧美在线观看视频高清 | 亚洲人成网站在线观看90影院 | 国产人人为我我为人人澡 | 男生插曲女生身全过程 | 欧美精品做人一级爱免费 | 国产高清视频青青青在线 | 亚洲日韩欧美国产中文在线 | 亚洲中文字幕无码一久久区 | 精品午夜国产福利观看 | av天堂电影网 | 九九精品久久 | 云南14学生真实初次破初视频 | 97人人超碰国产精品最新蜜芽 | 国产高清视频在线观看97 | 99精品久久 | 日韩欧美中文字幕一区 | 帅哥操帅哥 | 亚洲精品97福利在线 | 亚洲国产精品一区二区动图 | 墨西哥美女主播 | 某上海少妇3P黑人完整版BD | 性一交一无一伦一精一品 | 被肉日常np快穿高h 被肉日常np高h | 美女xx00| 亚洲午夜精品久久久久久抢 | 国产免费久久爱久久啪 | 国产亚洲精品影视在线 | 国内精品自线在拍2020不卡 | JLZZJLZZJLZ老师好多的水 jk制服喷水 | 国产免费午夜 | 999人在线精品播放视频 | 日本肉肉口番工全彩动漫 |