演算法總結 棧(正在更新)

2021-09-22 12:27:42 字數 2134 閱讀 2957

參考:

例項解析

題目2:子陣列的最小值之和

(1)只允許在一端進行插入和刪除的線性表。

(2)棧的插入操作稱為壓棧(push),棧的取出操作稱為出棧(pop)。

(3)棧的儲存結構分為順序儲存和鏈式儲存,順序儲存稱為順序棧,鏈式儲存稱為鏈式棧。

(1)逆序輸出:輸出次序和處理順序顛倒

(2)遞迴巢狀:具有自相似性的問題可遞迴描述,但分支位置和巢狀深度不固定

(3)十進位制轉n進製

(4)校驗括號是否匹配

(5)中綴表示式轉字尾表示式

(6)…

題目描述:給定乙個由 『(』 和 『)』 括號組成的字串 s,我們需要新增最少的括號』(』 或是 『)』,可以在任何位置,以使得到的括號字串有效。

從形式上講,只有滿足下面幾點之一,括號字串才是有效的:

它是乙個空字串,或者它可以被寫成 ab (a 與 b 連線), 其中 a 和 b 都是有效字串,或者它可以被寫作 (a),其中 a 是有效字串。

給定乙個括號字串,返回為使結果字串有效而必須新增的最少括號數。

示例:示例 1:輸入:"())" 輸出:1

示例 2:輸入:"(((" 輸出:3

示例 3:輸入:"()" 輸出:0

示例 4:輸入:"()))((" 輸出:4

首先建立乙個棧stack,然後進行下列棧操作:

(1) 如果棧為空:無論下一字元是什麼,將該字元壓入棧;

(2) 如果棧不為空:

a 若棧頂為』(』,下一字元為』)』,棧頂出棧;存在的情況:()

b 若不滿足a,無論下一字元是什麼,將該字元壓入棧;存在的情況:((, )), )(

(3)迴圈,最終 返回棧的size。

class

solution

else

else}}

return stack.

size();}}

遍歷字串,遇到左括號存到lstack中,遇到右括號如果lstack中有左括號那麼彈出乙個左括號抵消右括號,否則將右括號新增到rstack中,最後lstack和rstack中的左右括號都需要額外的新增括號抵消

public

intminaddtomakevalid

(string s)

else

else}}

return lstack.

size()

+rstack.

size()

;}

題目描述:給定乙個整數陣列 a,找到 min(b) 的總和,其中 b 的範圍為 a 的每個(連續)子陣列。由於答案可能很大,因此返回答案模 10^9 + 7。

示例:輸入:[3,1,2,4]

輸出:17

解釋:子陣列為 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。 最小值為 3,1,2,4,1,1,2,1,1,1,和為 17。

注:下面**可左右滑動檢視

class

solution

left[i]

= s1.

empty()

? i+

1: i - s1.

peek()

; s1.

push

(i);

int j = len -

1- i;

while

(!s2.

empty()

&& a[s2.

peek()

]>= a[j]

) right[j]

= s2.

empty()

? len - j : s2.

peek()

- j;

s2.push

(j);

}int ans =0;

for(

int i =

0; i < len; i++

)return ans;

}}

演算法總結 堆(正在更新)

參考 題目2 有序矩陣中第k小的元素 題目描述 給在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k...

演算法總結 深度優先搜尋(正在更新)

參考 例項解析 1 選定乙個未被訪問過的頂點v作為起始頂點 或者訪問指定的起始頂點v 並將其標記為已訪問過 2 搜尋與頂點v鄰接的所有頂點,判斷這些頂點是否被訪問過,如果有未被訪問過的頂點,則任選乙個頂點w進行訪問 再選取與頂點w鄰接的未被訪問過的任乙個頂點並進行訪問,依次重複進行。當乙個頂點的所有...

演算法總結大全(正在日更)

kmp 樸素的演算法 樸素的解釋 exkmp 演算法 最快最簡單的排序 桶排序 解釋很形象 kmp 模板 最精簡的 include include using namespace std const int n 1000002 int next n string s,t int slen,tlen ...