字符串
jz5. 替換空格
71. 簡(jiǎn)化路徑
150. 逆波蘭表達(dá)式求值
思路:分離符號(hào)位和數(shù)字位置济,注意判斷數(shù)字的字符號(hào)
數(shù)組
面試題:一個(gè)無(wú)序數(shù)組中兩個(gè)數(shù)之和等于給定的值N
方法一:窮舉法:全部遍歷壹瘟,時(shí)間復(fù)雜度為O(n^2)
方法二:先排序阅签,然后查找:使用快排(O(nlogn))矿瘦,然后使用兩個(gè)指針枕面,一個(gè)指針指向頭pi,一個(gè)指針指向尾部pj缚去,如果兩個(gè)指針指向的數(shù)字的和為N潮秘,則找到一組,pi++,pj--;如果和大于N則pj--;如果和小于N易结,則pi++枕荞。
方法三:遍歷數(shù)組稠通,將所有的值存入hash_map中
查找
jz11.旋轉(zhuǎn)數(shù)組的最小數(shù)字
時(shí)間復(fù)雜度的優(yōu)化為O(logn)
棧與隊(duì)列
jz.9用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
jz.30包含min函數(shù)的棧
zuo.用遞歸函數(shù)和棧操作逆序棧
zuo.用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序
239.滑動(dòng)窗口最大值 zuo.生成窗口最大數(shù)組
jz31.棧的壓入、彈出序列
借助一個(gè)棧來(lái)實(shí)現(xiàn)
鏈表:
jz6.從尾到頭打印鏈表
有非遞歸和遞歸兩種解法
234. 回文鏈表 [已二刷]
請(qǐng)判斷一個(gè)鏈表是否為回文鏈表买猖。
思路:方法一:用遍歷鏈表改橘,同時(shí)將結(jié)點(diǎn)存入棧中,然后用鏈表頭開(kāi)始與棧頂一個(gè)一個(gè)比較玉控,如果不相等返回false飞主,直到遍歷完成后全部一樣,返回true高诺。這種方法時(shí)間復(fù)雜度為O(n)碌识,空間復(fù)雜度為O(n)。
方法二:用雙指針找出中間結(jié)點(diǎn)虱而。然后反轉(zhuǎn)后半段鏈表筏餐。反轉(zhuǎn)完畢后,從最左邊結(jié)點(diǎn)與最右邊結(jié)點(diǎn)比較牡拇,相等都像中間移動(dòng)魁瞪,若有結(jié)點(diǎn)不相等,則ret=false惠呼;最后恢復(fù)鏈表导俘。
86. 分隔鏈表[已二刷]
給定一個(gè)鏈表和一個(gè)特定值 x,對(duì)鏈表進(jìn)行分隔剔蹋,使得所有小于 x 的節(jié)點(diǎn)都在大于或等于 x 的節(jié)點(diǎn)之前旅薄。你應(yīng)當(dāng)保留兩個(gè)分區(qū)中每個(gè)節(jié)點(diǎn)的初始相對(duì)位置。
思路:定義四個(gè)指針泣崩,分別是小于x的begin和end指針少梁,小于等于x的begin和end指針。然后遍歷鏈表矫付,并切分結(jié)點(diǎn)凯沪,將小于x的結(jié)點(diǎn)用小于x的begin和end指針維護(hù),將大于等于x的結(jié)點(diǎn)用另外兩個(gè)結(jié)點(diǎn)維護(hù)技即。遍歷結(jié)束時(shí)著洼,判斷小于x的begin指針是否為空,若為空而叼,返回大于等于x的begin結(jié)點(diǎn),若不為空豹悬,將小于x的end結(jié)點(diǎn)的next指針指向大于等于x的begin葵陵,返回小于x的begin結(jié)點(diǎn)。
138. 復(fù)制帶隨機(jī)指針的鏈表
給定一個(gè)鏈表瞻佛,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針脱篙,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)娇钱。要求返回這個(gè)鏈表的深度拷貝。
思路:
方法一:使用hasmap绊困,空間復(fù)雜度為O(n)
方法二:直接復(fù)制文搂,將next指針指向復(fù)制的結(jié)點(diǎn),空間復(fù)雜度為O(1)
141. 環(huán)形鏈表[已二刷]
給定一個(gè)鏈表秤朗,判斷鏈表中是否有環(huán)煤蹭。
思路:
方法一:借助set來(lái)判斷
方法二:快慢指針
142. 環(huán)形鏈表 II[已二刷]
給定一個(gè)鏈表,返回鏈表開(kāi)始入環(huán)的第一個(gè)節(jié)點(diǎn)取视。 如果鏈表無(wú)環(huán)硝皂,則返回 null。
方法一:借助set來(lái)判斷
方法二:快慢指針(原理一定要說(shuō)明白)
160. 相交鏈表[已二刷]
編寫(xiě)一個(gè)程序作谭,找到兩個(gè)單鏈表相交的起始節(jié)點(diǎn)稽物。
方法一:借助set來(lái)判斷
方法二:通過(guò)鏈表移動(dòng)來(lái)判斷
19. 刪除鏈表的倒數(shù)第N個(gè)節(jié)點(diǎn)
典型的快慢指針的,但其中有許多細(xì)節(jié)需要注意
jz22.鏈表中的倒數(shù)第k個(gè)結(jié)點(diǎn)
jz25.合并兩個(gè)排序鏈表
zuo.刪除鏈表的中間結(jié)點(diǎn)和a/b處的結(jié)點(diǎn)
刪除鏈表中的結(jié)點(diǎn)需要主要找到需要?jiǎng)h除結(jié)點(diǎn)的前一個(gè)元素折欠,然后再刪除結(jié)點(diǎn)贝或。
二叉樹(shù):
144. 二叉樹(shù)的前序遍歷[已二刷]
思路:遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)
94. 二叉樹(shù)的中序遍歷[已二刷]
思路:遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)
145. 二叉樹(shù)的后序遍歷[已二刷]
思路:遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)
jz7. 重建二叉樹(shù)
是一個(gè)很好的面試題,在手寫(xiě)的代碼的時(shí)候需要注意異常情況的判斷
331. 驗(yàn)證二叉樹(shù)的前序序列化
思路:
空結(jié)點(diǎn) - 非空結(jié)點(diǎn) = 1锐秦,維護(hù)這條等式傀缩。
297. 二叉樹(shù)的序列化與反序列化
思路:
序列化時(shí)將每個(gè)結(jié)點(diǎn)的數(shù)之間加入一個(gè)‘#’用來(lái)區(qū)分結(jié)點(diǎn)與結(jié)點(diǎn),用‘_’用來(lái)區(qū)分空結(jié)點(diǎn)农猬。
遍歷順序可以為前序遍歷赡艰、中序遍歷、后序遍歷斤葱。
反序列化時(shí)用‘#’來(lái)切分字符串慷垮,然后用對(duì)應(yīng)的遍歷生成二叉樹(shù)。
110. 判斷平衡二叉樹(shù)
思路:遞歸判斷左子樹(shù)和右子樹(shù)的高度差是否為1
98. 驗(yàn)證二叉搜索樹(shù)
思路:二叉搜索樹(shù)的中序遍歷的結(jié)果為遞增序列
222. 完全二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù) 注意注意:第一次遇見(jiàn)這樣的思路揍堕,還需要多練習(xí)
思路:通過(guò)統(tǒng)計(jì)左結(jié)點(diǎn)來(lái)獲取樹(shù)的高度料身,然后判斷根結(jié)點(diǎn)的右結(jié)點(diǎn)的最左結(jié)點(diǎn)是否為空,若不為空衩茸,則左子樹(shù)加根結(jié)點(diǎn)的個(gè)數(shù)為2 ^(h-level)芹血,若為空,則右子樹(shù)的加上根結(jié)點(diǎn)的個(gè)數(shù)為2 ^(h-level-1)楞慈。遞歸求和幔烛。
226. 翻轉(zhuǎn)二叉樹(shù) jz27.二叉樹(shù)的鏡像
注:貝殼二面面試時(shí)手撕的代碼,現(xiàn)場(chǎng)寫(xiě)出來(lái)了囊蓝,回來(lái)看leetcode原來(lái)是個(gè)簡(jiǎn)單題饿悬,面試官手下留情了。
101. 對(duì)稱二叉樹(shù) jz28.對(duì)稱二叉樹(shù)
是上一題的延續(xù)聚霜,還需要重新回顧狡恬。
思路:根據(jù)原二叉樹(shù)的前序遍歷順序與對(duì)稱二叉樹(shù)的順序比較珠叔,如果比較的結(jié)點(diǎn)有一個(gè)為空,另一個(gè)不為空弟劲,返回false祷安,如果比較的結(jié)點(diǎn)中value值不相等,返回false兔乞。
655. 輸出二叉樹(shù)
學(xué)習(xí)到的知識(shí)點(diǎn):vector中不僅可以初始化int類型汇鞭,也可以初始化string類型,初始值為""报嵌。
先將n*m維數(shù)組的中的值初始化為"",然后修改與二叉樹(shù)對(duì)應(yīng)的值虱咧。
jz54.二叉搜索樹(shù)的第k個(gè)結(jié)點(diǎn)
思路:根據(jù)二叉搜索樹(shù)本的的性質(zhì):二叉搜索樹(shù)中序遍歷有序性,可以找到第k個(gè)結(jié)點(diǎn)锚国。最好用非遞歸的方法寫(xiě)腕巡。
jz. 二叉樹(shù)的層次遍歷 102. 二叉樹(shù)的層次遍歷
思路:借助兩個(gè)queue交替來(lái)層次遍歷二叉樹(shù)
103. 二叉樹(shù)的鋸齒形層次遍歷
思路:借助兩個(gè)棧來(lái)實(shí)現(xiàn),其中主要入棧順序
jz.之字形打印二叉樹(shù)
思路:借助隊(duì)列和棧來(lái)層次遍歷二叉樹(shù)
jz8.二叉樹(shù)中序遍歷的下一個(gè)結(jié)點(diǎn)
思路:如果該結(jié)點(diǎn)有右子樹(shù)血筑,則下一個(gè)結(jié)點(diǎn)為該右子樹(shù)的最左結(jié)點(diǎn)绘沉;如果該結(jié)點(diǎn)沒(méi)有右子樹(shù),則判斷該結(jié)點(diǎn)是否為父結(jié)點(diǎn)的左孩子豺总,若是车伞,則父結(jié)點(diǎn)為該結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn);若不是喻喳,則向上遍歷另玖,若找得到某個(gè)結(jié)點(diǎn)是父結(jié)點(diǎn)的左孩子,則為該結(jié)點(diǎn)表伦,若找不到谦去,則為空。
jz26.樹(shù)的子結(jié)構(gòu)
很好的一遞歸個(gè)思路蹦哼,需要留意鳄哭。
jz33.二叉搜索樹(shù)的后序遍歷
遇到這種題,首先先自己畫(huà)出一個(gè)二叉搜索樹(shù)纲熏,并將其后序遍歷的數(shù)組寫(xiě)出來(lái)妆丘,查找規(guī)律:根據(jù)數(shù)組最后一個(gè)數(shù)(根結(jié)點(diǎn))來(lái)將數(shù)組分為小于根結(jié)點(diǎn)的數(shù)組和大于根結(jié)點(diǎn)的數(shù)組,然后遞歸判斷即可局劲。
堆
295. 數(shù)據(jù)流的中位數(shù)
思路:維護(hù)一個(gè)最大堆和一個(gè)最小堆勺拣,中位數(shù)就在這兩個(gè)堆的堆頂。
哈希
380. 常數(shù)時(shí)間插入容握、刪除和獲取隨機(jī)元素
思路:重點(diǎn)是索引的建立
并查集
200. 島嶼的個(gè)數(shù)
思路:1. 在單CPU中可以用影響函數(shù)來(lái)標(biāo)識(shí)島嶼宣脉;2. 在大數(shù)據(jù)的時(shí)候需要用到并查集
547. 朋友圈
思路:先將每個(gè)小朋友當(dāng)作獨(dú)立的集合,然后將有聯(lián)系的小朋友union為同一個(gè)集合剔氏,最后輸出集合的個(gè)數(shù)塑猖。
前綴樹(shù)(Trie樹(shù))
208. 實(shí)現(xiàn) Trie (前綴樹(shù))
Trie樹(shù)的基本實(shí)現(xiàn)過(guò)程
211. 添加與搜索單詞 - 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
線段樹(shù)
貪心
動(dòng)態(tài)規(guī)劃
其他
jz29.順時(shí)針打印矩陣
這個(gè)題的邊界條件需要特別主要,理解打印過(guò)程就不太難了谈跛,難點(diǎn)就在邊界條件的考慮上羊苟。