国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【面試經(jīng)典150 | 棧】最小棧

這篇具有很好參考價值的文章主要介紹了【面試經(jīng)典150 | ?!孔钚!OM麑Υ蠹矣兴鶐椭?。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Tag

【設(shè)計類】【?!?/p>


題目來源

155. 最小棧

【面試經(jīng)典150 | 棧】最小棧,面試經(jīng)典150題,設(shè)計類,棧

題目解讀

本題是一個設(shè)計類的題目,設(shè)計一個最小棧類 MinStack() 實現(xiàn):

  • MinStack():初始化堆棧對象;
  • void push(int val):將元素val推入堆棧;
  • void pop():刪除堆棧頂部的元素;
  • int top():獲取堆棧頂部的元素;
  • int getMin():獲取堆棧中的最小元素。

解題思路

方法一:輔助棧

維護兩個棧,一個棧就是常規(guī)的棧 stk1,另一個棧 stk2 用來存放已經(jīng)插入棧 stk1 中數(shù)字的最小值。

注意入棧和出棧操作時兩個棧都要更新。

實現(xiàn)代碼

class MinStack {
	
public:
	MinStack() {
		min_stk.push(INT_MAX);
	}

	void push(int val) {
		stk.push(val);
		min_stk.push(std::min(min_stk.top(), val));
	}

	void pop() {
		stk.pop();
		min_stk.pop();
	}

	int top() {
		return stk.top();
	}

	int getMin() {
		return min_stk.top();
	}

private:
	std::stack<int> stk;
	std::stack<int> min_stk;
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

復(fù)雜度分析

時間復(fù)雜度: O ( 1 ) O(1) O(1)。

空間復(fù)雜度: O ( n ) O(n) O(n), n n n 為 操作次數(shù)。

方法二:一個棧

可以只使用一個棧來同時保存當(dāng)前的最小值和 val。

實現(xiàn)代碼

class MinStack {
private:
    stack<pair<int, int>> stk;
public:
    MinStack() {
        stk.push(make_pair(INT_MAX, INT_MAX));
    }
    
    void push(int val) {
        stk.push({min(stk.top().first, val), val});
    }
    
    void pop() {
        stk.pop();
    }
    
    int top() {
        return stk.top().second;
    }
    
    int getMin() {
        return stk.top().first;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

復(fù)雜度分析

時間復(fù)雜度: O ( 1 ) O(1) O(1)。

空間復(fù)雜度: O ( 1 ) O(1) O(1)。

方法三:棧中存放差值

現(xiàn)在我們維護一個變量 minVal,表示當(dāng)前插入的變量的最小值,棧中每次入棧的是 valminVal 的差值 differ。現(xiàn)在進行具體分析:

  • push(int val):如果此時棧為空,我們更新 minVal = val,向棧中插入 0;如果此時棧非空,首先向棧中插入 diff,根據(jù) diff 的值來更新 minVal
    • 如果 diff > 0,說明插入的 val 大于當(dāng)前的 minVal,則 minVal 不需要更新;
    • 否則表明插入的 val 小于或者等于當(dāng)前的 minVal,則更新 minVal = val
  • pop():我們需要根據(jù) diff 來更新彈出棧頂元素后的 minVal,具體地:
    • 先彈出棧頂元素 diff,并 pop;
    • 如果 diff > 0,說明我們當(dāng)時插入的 val 大于當(dāng)時的 minVal,則 minVal 是不需要更新的;
    • 否則說明當(dāng)時插入的 val 小于或者等于 minVal,當(dāng)時的 minVal 是插入的 val,需要將 minVal 還原回去,即當(dāng)時插入 val 更新 minVal 的過程如下,還原回去得到 minVal = minVal + diff。

d i f f = v a l ? m i n V a l ; m i n V a l = v a l ; diff = val - minVal; minVal = val; diff=val?minVal;minVal=val;

  • top():如果 diff < 0,表示 minVal 就是最小棧的棧頂元素,否則 minVal + diff 才是最小棧的棧頂元素。
  • getMin():直接返回 minVal 即可。

實現(xiàn)代碼

class MinStack {
private:
    stack<long long> stk;
    long long minVal, diff;
public:
    MinStack() {
    }
    
    void push(int val) {
        if (stk.empty()) {
            stk.push(0);
            minVal = val;
        }
        else {
            diff = val - minVal;
            stk.push(diff);
            minVal = diff > 0 ? minVal : val;
        }
    }
    
    void pop() {
        diff = stk.top();
        stk.pop();
        if (diff < 0) {
            minVal = minVal - diff;
        }
    }
    
    int top() {
        return stk.top() < 0 ? minVal : minVal + stk.top();
    }
    
    int getMin() {
        return minVal;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

復(fù)雜度分析

時間復(fù)雜度: O ( 1 ) O(1) O(1)。

空間復(fù)雜度: O ( 1 ) O(1) O(1)。


其他語言

python3

以下只給出方法三的 python3 代碼,該方法比較巧妙,值得好好研究。

class MinStack:
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []

    def push(self, x: int) -> None:
        if not self.stack:
            self.stack.append(0)
            self.min_value = x
        else:
            diff = x-self.min_value
            self.stack.append(diff)
            self.min_value = self.min_value if diff > 0 else x

    def pop(self) -> None:
        if self.stack:
            diff = self.stack.pop()
            if diff < 0:
                self.min_value = self.min_value - diff

    def top(self) -> int:
        return self.min_value if self.stack[-1] < 0 else self.stack[-1] + self.min_value

    def getMin(self) -> int:
        return self.min_value if self.stack else -1

寫在最后

如果文章內(nèi)容有任何錯誤或者您對文章有任何疑問,歡迎私信博主或者在評論區(qū)指出 ??????。

如果大家有更優(yōu)的時間、空間復(fù)雜度方法,歡迎評論區(qū)交流。

最后,感謝您的閱讀,如果感到有所收獲的話可以給博主點一個 ?? 哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-718874.html

到了這里,關(guān)于【面試經(jīng)典150 | 棧】最小棧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【面試經(jīng)典150 | 矩陣】生命游戲

    【面試經(jīng)典150 | 矩陣】生命游戲

    本專欄專注于分析與講解【面試經(jīng)典150】算法,兩到三天更新一篇文章,歡迎催更…… 專欄內(nèi)容以分析題目為主,并附帶一些對于本題涉及到的數(shù)據(jù)結(jié)構(gòu)等內(nèi)容進行回顧與總結(jié),文章結(jié)構(gòu)大致如下,部分內(nèi)容會有增刪: Tag:介紹本題牽涉到的知識點、數(shù)據(jù)結(jié)構(gòu); 題目來源:

    2024年02月07日
    瀏覽(25)
  • 面試經(jīng)典 150 題 - 多數(shù)元素

    面試經(jīng)典 150 題 - 多數(shù)元素

    給定一個大小為 n 的數(shù)組 nums ,返回其中的多數(shù)元素。多數(shù)元素是指在數(shù)組中出現(xiàn)次數(shù) 大于 ? n/2 ? 的元素。 你可以假設(shè)數(shù)組是非空的,并且給定的數(shù)組總是存在多數(shù)元素。 示例 1: 輸入:nums = [3,2,3] 輸出:3 示例 2: 輸入:nums = [2,2,1,1,1,2,2] 輸出:2 進階:嘗試設(shè)計時間復(fù)

    2024年01月23日
    瀏覽(20)
  • 面試經(jīng)典150題【11-20】

    面試經(jīng)典150題【11-20】

    用一個哈希表和一個變長數(shù)組組成一個新的數(shù)據(jù)類型。 獲取隨機元素的話,直接random一個數(shù)然后從數(shù)組里取就行。 插入和刪除的話,先判斷有沒有這個數(shù),哈希表里存的是{ 數(shù)據(jù):在變長數(shù)組中的索引} 插入的話直接插變長數(shù)組末尾,然后再在哈希表里插 刪除的話,把最后一

    2024年02月21日
    瀏覽(25)
  • 面試經(jīng)典150題(82-83)

    leetcode 150道題 計劃花兩個月時候刷完,今天(第四十一天)完成了2道(82-83)150: 82.(133. 克隆圖)題目描述: 第一版(這個之前有過是拷貝二叉樹的時候和這個類似,利用map 映射就是當(dāng)前節(jié)點和當(dāng)前節(jié)點的復(fù)制節(jié)點) 第83題順序應(yīng)該是 leetcode 的 《399. 除法求值》但是實在是

    2024年01月19日
    瀏覽(12)
  • 面試經(jīng)典150題(1)

    面試經(jīng)典150題(1)

    今天開始我將陸續(xù)為大家更新面試經(jīng)典150題中較難理解的題目。今天我為大家分享的是,除自身以外數(shù)組的乘積、跳躍游戲| 和 跳躍游戲||。 除自身以外數(shù)組的乘積 給你一個整數(shù)數(shù)組 nums,返回 數(shù)組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數(shù)據(jù)

    2024年02月10日
    瀏覽(61)
  • 面試經(jīng)典150題(88-89)

    leetcode 150道題 計劃花兩個月時候刷完,今天(第四十四天)完成了2道(88-89)150: 88.(22. 括號生成) 題目描述: 第一版(沒通過,我想法是 ()的全排列然后找出來符合的并且去重。。超時了) 第二版(看了解題) 89.(79. 單詞搜索)題目描述: 第一版(沒超時,但是效率墊

    2024年01月18日
    瀏覽(17)
  • 面試經(jīng)典150題(78-81)

    leetcode 150道題 計劃花兩個月時候刷完,今天(第三十六天)完成了4道(78-81)150: 78.(230. 二叉搜索樹中第K小的元素)題目描述: 第一版(銘記!!二叉搜索樹的中序遍歷為遞增的) 79.(98. 驗證二叉搜索樹)題目描述: 第一版(我第一反應(yīng)就是遞歸,但是遞歸了好久沒弄出

    2024年02月02日
    瀏覽(17)
  • 面試經(jīng)典150題(85-87)

    leetcode 150道題 計劃花兩個月時候刷完,今天(第四十三天)完成了3道(85-87)150: 85.(77. 組合)題目描述: 第一版(昨天就是這個卡了好久沒弄出來,今天還是沒思路啊。。看了解題,感覺都是一個for 然后for里面嵌套??纯唇忸}的代碼吧) 86.(46. 全排列)題目描述: 第一版

    2024年01月18日
    瀏覽(15)
  • 面試經(jīng)典150題——生命游戲

    面試經(jīng)典150題——生命游戲

    2.1 思路一——暴力求解 之所以先暴力求解,是因為我開始也沒什么更好的思路,所以就先寫一種解決方案,沒準(zhǔn)寫著寫著就來新的靈感了。暴力求解思路還是很簡單的,就是嘗試遍歷面板的每個格子,判斷其周圍八個位置的狀態(tài)(對于邊角需要特殊處理),根據(jù)邊角種存在

    2024年02月21日
    瀏覽(20)
  • 【面試經(jīng)典150 | 數(shù)組】移除元素

    【面試經(jīng)典150 | 數(shù)組】移除元素

    本專欄專注于分析與講解【面試經(jīng)典150】算法,兩到三天更新一篇文章,歡迎催更…… 專欄內(nèi)容以分析題目為主,并附帶一些對于本題涉及到的數(shù)據(jù)結(jié)構(gòu)等內(nèi)容進行回顧與總結(jié),文章結(jié)構(gòu)大致如下,部分內(nèi)容會有增刪: Tag:介紹本題牽涉到的知識點、數(shù)據(jù)結(jié)構(gòu); 題目來源:

    2024年02月09日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包