參考:
例項解析
題目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 ...