劍指LeetCode面試演算法 棧 佇列 堆

2021-10-03 16:28:19 字數 4459 閱讀 4100

一、基礎知識

棧:後進先出的線性表;stl方法包含push(x),pop(),top(),empty()

佇列:先進先出的線性表;stl方法包含push(x),pop(),top(),empty()

二、目錄

使用佇列實現棧

三、 解題

1.使用佇列實現棧

這題在劍指offer中是面試題9(用兩個佇列實現棧),leetcode229。使用佇列實現棧。

對於1,2,3,4,5這樣乙個序列,

用棧儲存,從上至下為5,4,3,2,1。5為棧頂,使用top返回5,push(x)則x變為棧頂;

用佇列儲存,從上至下為5,4,3,2,1。1為隊頭,使用top返回1,push(x)x插入尾部,1還是隊頭;

思路:使用兩個佇列,queue1佇列依次push 1 2 3,這時1為隊頭,使用pop彈出的是1,不符合棧後進先出的要求,於是先將1,2 push進queue2,query1剩餘3,此時pop彈出為3,實現了彈出棧頂元素的需求。如需要彈出2,則重複步驟,先將1 push進queue1,直到queue2剩下最後乙個元素即2,此時彈出可得到2

待寫
2.使用棧實現佇列

這題在劍指offer中是面試題9(用兩個棧實現佇列),leetcode232。

思路:使用兩個棧,push值到stack1中,front時將stack1的棧頂push進stack2中,原先stack1中的棧頂就變成stack2的棧底,原先stack1的棧底(隊首)變為stack2棧頂,用top可得到stack2的棧頂,也就是隊首元素。

#include

#include

class

myqueue

intfront()

}int res = stack2.

top();

return res;

}void

pop()}

;int

main()

3.包含min函式的棧

這題在劍指offer中是面試題9(用兩個棧實現佇列),leetcode155。

設計乙個棧,包含push,pop,top,getmin,要求演算法複雜度為o(1)

思路:由於要求複雜度為常數級,故不能採取遍歷的方式記錄最小值;故使用乙個最小值棧,資料棧中每push乙個值,直接push就好;對應最小值棧需要將新值和棧頂元素進行進行比較,誰小就push誰。

};4.出棧序列是否合法

已知從1至n的數字序列,按順序入棧,每個數字入棧後即可出棧,也可在棧中停留,等待後面的數字入棧出棧後,該數字再出棧,求該數字序列的出棧序列是否合法?

這題在劍指offer中是面試題31。

思路:1.出棧結果儲存在佇列 order中(也可以用輔助棧)

2.按元素順序,將元素push進入棧,

3.每push1個元素,即檢查是否與佇列首部元素相同,若相同則彈出佇列首元素,彈出棧頂元素,直到兩元素不同結束

4.若最終棧為空,說明序列合法,否則不合法

整體複雜度o(n)

#include

#include

#include

class

checkordervalid}if

(!s.

empty()

)// s不空說明還有元素,即序列不合法

return

false

;return

true;}

};intmain()

else

return0;

}

5.把字串轉換成整數

把字串轉換成整數

思路:看題目似乎很簡單,但是如果考慮清楚輸入的可能性,**量還是挺多的。

#include

long

long

strtointcore

(const

char

* str,

bool minus)

;enum status

;int g_nstatus = kvalid;

intstrtoint

(const

char

* str)if(

*str !=

'\0'

) num =

strtointcore

(str, minus);}

return

(int

)num;

}long

long

strtointcore

(const

char

* digit,

bool minus)

digit++;}

else}if

(*digit ==

'\0'

) g_nstatus = kvalid;

return num;

}// ********************測試**********************

void

test

(const

char

* string)

intmain

(int argc,

char

* ar**)

6.求陣列中第k大的數(二叉堆)

乙個未排序的陣列,求其中第k大的值。 leetcode215題

乙個陣列中求第k大,只要將前k大的值存入堆中,最小堆會自動調整,始終保證堆頂為堆中最小值,使用top即求得第k大值。

#include

#include

主要是std::priority_queue<

int, std::vector<

int>

, std::greater<

int>

> q;最小堆

class

arraykthheap

else

if(q.

top(

)< nums[i])}

return q.

top();

}};int

main()

7.求動態陣列中位數

劍指offer面試題41,leetcode295

設計乙個資料結構,該資料結構動態維護一組資料,且支援如下操作:

1.新增元素:void addnum(int num),將整型num新增至資料結構中。

2.返回資料的中位數:double findmedian返回其維護的資料的中位數

中位數定義

1.若資料個數為奇數,中位數是該組數排序後中間的數。【1,2,3】->2

2.若資料個數為偶數,中位數是該組數排序後中間的兩個數字的平均值。【1,2,3,4】->2.5

思路:最大堆的堆頂是堆中最大的,最小堆的堆頂是堆中最小的,最大堆的堆頂《最小堆的堆頂

動態新增資料到最大最小堆中:需要兩個堆大小差距不超過1,新增的數加入到較少的堆中

堆頂相加/2即為中位數

插入時間複雜度nlogn,得到中位數複雜度n

劍指offer面試演算法題

1.長度為n的陣列裡面的元素都在0 n 1之間,找出第乙個重複的數字 思路 從頭到尾依次遍歷,如果當前的值a i i,如果a i a a i 那麼需要把a a i 位置上的值與a i 作交換 把對的值放在對的位置 之後繼續判斷此時的a i 位置沒有移動 如果a i a a i 證明對的位置上有對的元...

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...

面試演算法記錄

1.親和數問題 求500萬以內的所有親和數 如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。例如220和284,1184和1210,2620和2924。思路 220 1 2 4 71 142 sum 284 284 1 2 4 5 10 11 20 22...