leetcode演算法專題訓練 四 棧與佇列專題

2021-10-18 05:09:19 字數 4587 閱讀 5206

劍指 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)。

若隊列為空,pop_front 和 max_value 需要返回 -1

解題思路:用兩個輔助queue,乙個存放元素的值,乙個作為單調遞減佇列

時間複雜度: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:

輸入: 「((()))」

輸出: 3

解釋: 最長有效括號子串為 「((()))」

示例 2:

輸入: 「)()())」

輸出: 4

解釋: 最長有效括號子串為 「()()」

示例 3:

輸入: 「()(())」

輸出: 6

解釋: 最長有效括號子串為 「()(())」

解題思路:先通過模擬棧的方法,記錄不能夠進行匹配消除的所有 『(』 的下標置位為1,然後該問題就進行了轉換,也就是在只有0 和 1 的陣列中求 連續0 的最大長度,可以以 1 作為界限,計算中間區域的長度。

時間複雜度: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 中存在這樣的子串,我們保證它是唯一的答案。解答 滑動視窗就是用一左一右兩個指標來做。右指標移動,一旦滿足條件,則判斷當前長度是不...