劍指 offer 09. 用兩個棧實現佇列
解題思路:設定兩個佇列,左邊的佇列用來入隊,右邊的佇列用來出隊。
時間複雜度:o(1)
空間複雜度:o(1)
class
cqueue
void
(int value)
intdeletehead()
}}int val = stk2.
top();
stk2.
pop();
return val;}}
;
劍指 offer 30. 包含min函式的棧
題目描述:定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min、push 及 pop 的時間複雜度都是 o(1)。解題思路:用兩個棧,乙個棧存放正常的元素,另乙個棧儲存此時元素中的最小值。
時間複雜度:min, push, pop, top 均為o(1)
空間複雜度:o(n)
class
minstack
void
push
(int x)
}void
pop()}
inttop()
intmin()
};
劍指 offer 59 - ii. 佇列的最大值
題目描述:請定義乙個佇列並實現函式 max_value 得到佇列裡的最大值,要求函式max_value、push_back 和 pop_front 的均攤時間複雜度都是o(1)。解題思路:用兩個輔助queue,乙個存放元素的值,乙個作為單調遞減佇列若隊列為空,pop_front 和 max_value 需要返回 -1
時間複雜度:o(n)
空間複雜度:o(n)
class
maxqueue
intmax_value()
void
push_back
(int value)
intpop_front()
};
劍指 offer 31. 棧的壓入、彈出序列
題目描述:輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 是某棧的壓棧序列,序列 是該壓棧序列對應的乙個彈出序列,但 就不可能是該壓棧序列的彈出序列。解題思路:遍歷彈棧序列,並設定輔助棧,保證每一次迴圈都能夠進行彈棧即可,若無法彈棧,那麼就將壓棧序列挨個入棧。
時間複雜度:o(n)
空間複雜度:o(n)
class
solution
stk.
pop();
}return
true;}
};
20.有效的括號
題目描述:給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。解題思路:建立輔助棧,for迴圈遍歷字串,當 棧為空 或者 元素與棧頂不匹配 的時候繼續入棧,反之出棧;最後根據棧是否為空判斷該字串的有效性。另外判斷括號匹配需要建立雜湊表。有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
時間複雜度:o(n)
空間複雜度:o(n)
class
solution,'
},};
std::stack<
char
> stk;
for(
auto
& e: s)
return stk.
empty()
;}};
32.最長的有效括號
題目描述:給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。解題思路:先通過模擬棧的方法,記錄不能夠進行匹配消除的所有 『(』 的下標置位為1,然後該問題就進行了轉換,也就是在只有0 和 1 的陣列中求 連續0 的最大長度,可以以 1 作為界限,計算中間區域的長度。示例 1:
輸入: 「((()))」
輸出: 3
解釋: 最長有效括號子串為 「((()))」
示例 2:
輸入: 「)()())」
輸出: 4
解釋: 最長有效括號子串為 「()()」
示例 3:
輸入: 「()(())」
輸出: 6
解釋: 最長有效括號子串為 「()(())」
時間複雜度:o(n)
空間複雜度:o(n)
class
solution
int r = n;
int ans =0;
while
(!stk.
empty()
) ans = std::
max(ans, r-0)
;return ans;}}
;
22.括號生成
題目描述:數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。解題思路:dfs法,記錄左右括號的剩餘值,當剩餘值都為0時說明匹配完成;注意左括號的剩餘值是必須小於右括號的剩餘值。
時間複雜度:
空間複雜度:
class
solution
if(l <= r)
if(r >=0)
}}vector
generateparenthesis
(int n)
};
150.逆波蘭表示式求值
題目描述:解題思路:逆波蘭表示式的核心在於遇到數字時進行入棧,遇到運算符號時出棧兩個元素,並將其計算的結果入棧,最後彈出棧中剩下的最後乙個元素即可。根據 逆波蘭表示法,求表示式的值。
有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。
說明:整數除法只保留整數部分。
給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0 的情況。
逆波蘭表示式:
逆波蘭表示式是一種字尾表示式,所謂字尾就是指算符寫在後面。
平常使用的算式則是一種中綴表示式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
該算式的逆波蘭表示式寫法為 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波蘭表示式主要有以下兩個優點:
去掉括號後表示式無歧義,上式即便寫成 1 2 + 3 4 + * 也可以依據次序計算出正確結果。
適合用棧操作運算:遇到數字則入棧;遇到算符則取出棧頂兩個數字進行計算,並將結果壓入棧中。
時間複雜度:o(n)
空間複雜度:o(n)
class
solution
}else
stk.
push
(stoi
(e));}
int sum = stk.
top();
return sum;}}
;
239. 滑動視窗最大值
題目描述:給你乙個整數陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。[1 3 -1] -3 5 3 6 7 3返回滑動視窗中的最大值。
滑動視窗的位置 最大值
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
解題思路:用乙個單調deque作為輔助,存放的是單調遞減的元素下標,當新的元素更大不滿足單調減的特性時需要從隊尾出隊,當deque長度超長時需要從隊頭出隊。
時間複雜度:o(n)
空間複雜度:o(n)
class
solution
; std::deque<
int> deque;
//儲存下標
for(
int i =
0; i < k;
++i)
vector<
int> ans
;for
(int i = k; i < nums.
size()
; i++
)return ans;}}
;
leetcode演算法專題訓練 七 查詢專題
33.搜尋旋轉排序陣列題目描述 公升序排列的整數陣列 nums 在預先未知的某個點上進行了旋轉 例如,0,1,2,4,5,6,7 經旋轉後可能變為 4,5,6,7,0,1,2 請你在陣列中搜尋 target 如果陣列中存在這個目標值,則返回它的索引,否則返回 1 每乙個數都是獨一無二的。解題思路 二...
leetcode演算法專題訓練 十四 位操作專題
50.pow x,n 題目描述 實現 pow x,n 即計算 x 的 n 次冪函式。100.0 x 100.0 n 是 32 位有符號整數,其數值範圍是 2 31,2 31 1 解題思路 基於二進位制的快速冪運算,x n 求解,將 n 轉化為二進位制數,不斷在二進位制數的n末尾判斷是1還是0,是1的...
leetcode專題訓練 滑動視窗
1 76.最小覆蓋子串 給你乙個字串 s 乙個字串 t 返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 注意 如果 s 中存在這樣的子串,我們保證它是唯一的答案。解答 滑動視窗就是用一左一右兩個指標來做。右指標移動,一旦滿足條件,則判斷當前長度是不...