背景
接上篇的背景,繼續看看,首先把大綱再發一份出來。
乾貨(高級部分)
1. 高級數據結構概念,基本操作,以及優缺點等
1.1 二叉查找樹
簡單題
中等題
1.2 堆
簡單題
中等題
1.3 圖論
簡單題
中等題
2. 常用算法及思想
2.1 排序算法(快速、插入、堆排序等)
簡單題
中等題
2.2 迭代、遞歸的思想
簡單題
中等題
2.3 分治的思想(如:二分查找、歸併排序等)
簡單題
中等題
2.4 搜索算法(深度,廣度)
簡單題
中等題
2.5 貪心算法
簡單題
中等題
2.5 動態規劃(揹包0-1難度)
簡單題
中等題
附錄:吐血整理的筆記
用數據結構和算法
數據結構:字符串、數組、棧、隊列(包括優先隊列、雙端隊列)、鏈表、哈希表、Set、二叉樹。最小堆最大堆的問題都可以用優先隊列來解題,堆的調整我還是有點暈的。
算法:二叉樹的前/中/後序/層次遍歷;圖的BFS、DFS、最短路徑算法、最小生成樹;回溯、遞歸、動態規劃等。排序算法基本數據結構有現成輪子,瞭解原理就好。
這塊重點看官方的考試範圍。
對於JAVA,重點搞清楚常用的幾大集合類特點(是否有序、什麼順序、是否允許重複),才能在解題過程中立即想到某個特性需用哪個數據結構、哪個類庫。
刷題過程中總結的典型解題思路(持續刷,有經驗的請繞路)
1. 滑動窗口篇
滑動窗口是一種雙指針解題思路,採用left、right左右兩個指針,表示一個滑動的窗口之最左端和最右端(初始化 left = right = 0)。左右指針輪流前進,窗口大小增增減減(窗口大小可固定可動態,依據題目要求),窗口不斷向右滑動,最終可實現在線性時間內獲得問題最佳解。有時題目需要輔以HashMap、數組進行判存在性、可行性。
推薦文章:滑動窗口
2.鏈表篇
鏈表最基礎的操作:創建、插入、刪除是必須掌握的。
常用解題方法主要是採用快慢指針(僅涉及查找操作)、增加輔助頭節點(涉及增刪改操作),在此基礎上對怎麼判斷鏈表有環及入環點、中間節點、倒數K個等解題小技巧建議熟練掌握。鏈表題一定要白紙上畫,畫出來就能寫出來。
推薦文章:鏈表
3.圖篇
推薦程序員小灰2019年關於圖的幾篇帖子,講的非常通俗易懂了
4. 二叉樹篇
二叉樹感覺沒啥技巧,基本功紮實就好。重點是前/中/後序/層序遍歷,LeetCode上會基於這些生出些變種,比如Z字形打印,從前序與中序,從中序和後序遍歷恢復二叉樹等,劍指offer和小灰上有典型講解。
5. 回溯法篇
回溯算法是類似枚舉的搜索嘗試過程,按照深度優先搜索的策略,從根結點出發深度探索解空間樹,當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去;如果該節點不包含問題的解,就“回溯”返回,即退回一步重新選擇,嘗試別的路徑。
若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜索遍才結束。而若使用回溯法求任一個解時,只要搜索到問題的一個解就可以結束。
適應題型:求全排列組合
模板:刷題過程中看到LeetCode裏有個不錯的模板,待補充。
6. 動態規劃篇
動態規劃就是下一狀態可以根據上一狀態,或之前幾個狀態獲取到的一種推理過程。可以看下詳解動態規劃——鄒博講動態規劃一文,其中講了路徑、硬幣、最長子序列。
雖然多次考到,我狠刷了七八道,自己推理狀態轉移方程總是暈–#,好在DP能解的問題,還有其它輪子可以解。
7. 位運算篇
位運算很基礎了,典型的位運算技巧與應用,但平時工作中用的偏少,溫故下:位運算