fucking-algorithm:
https://github.com/labuladong/fucking-algorithm/blob/master/README.md#%E7%9B%AE%E5%BD%95
經典200題解:
https://cyc2018.github.io/CS-Notes/#/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%951
算法思想:
一、排序:
List<Integer>轉換為int[]的方法:intlist.stream().mapToInt(Integer::intValue).toArray();
Integer[]轉換為int[]的方法:Arrays.stream(intArr22).mapToInt(Integer::intValue).toArray();
歸并排序:
堆排序:
插入排序:
二、遞歸:
遞歸的意思:我子節點下的所有節點都已經反轉好了,現在就剩我和我的子節點沒有完成最后的反轉了,所以反轉一下我和我的子節點。
三、雙指針(包括滑動窗口算法)
雙指針問題解題框架:
滑動窗口解題框架:
92. 反轉鏈表 II? (反轉從位置?m?到?n?的鏈表。請使用一趟掃描完成反轉。)
四、二分查找
https://time.geekbang.org/column/article/42733
1、查找第一個值等于給定值的元素;
2、查找最后一個值等于給定值的元素;
3、查找第一個大于等于給定值的元素;
4、查找最后一個小于等于給定值的元素;
五、搜索算法(BFS、DFS、回溯算法)
回溯算法解題框架:
1、子集排列組合
???39.組合總和(https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/)
????40. 組合總和 II(https://leetcode-cn.com/problems/combination-sum-ii/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-3/)
????46. 全排列(https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-by-powcai-2/)
????47. 全排列 II(https://leetcode-cn.com/problems/permutations-ii/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liwe-2/)
????78. 子集(https://leetcode-cn.com/problems/subsets/solution/hui-su-python-dai-ma-by-liweiwei1419/)
????90. 子集 II(https://leetcode-cn.com/problems/subsets-ii/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-19/)
六、分治思想
七、貪心算法
貪心算法之區間調度問題:
八、動態規劃
動態規劃解題框架:
1、子序列問題模板
2、股票買賣
3、打家劫舍
#0120 https://leetcode-cn.com/problems/triangle/
#0064 https://leetcode-cn.com/problems/minimum-path-sum/
#0322 https://leetcode-cn.com/problems/coin-change/
#0072 https://leetcode-cn.com/problems/edit-distance/
#1143 https://leetcode-cn.com/problems/longest-common-subsequence/
#0674 https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
告別動態規劃,連刷40道動規算法題,我總結了動規的套路:
https://cloud.tencent.com/developer/article/1538177
九、基本數據結構
1、數組
數組和List的轉換使用:
https://leetcode-cn.com/problems/merge-intervals/solution/pai-xu-by-powcai/
List<int[]> res =newArrayList<>();
int[][] arr = res.toArray(newint[0][]);
2、鏈表
LeetCode對應編號:206,141,21,19,876。
5 個常見的鏈表操作:
單鏈表反轉(206)
鏈表中環的檢測(141、142)
兩個有序的鏈表合并(21)
刪除鏈表倒數第 n 個結點(19)
求鏈表的中間結點(876:https://leetcode-cn.com/problems/middle-of-the-linked-list/submissions/)
經常用來檢查鏈表代碼是否正確的邊界條件有這樣幾個:
如果鏈表為空時,代碼是否能正常工作?
如果鏈表只包含一個結點時,代碼是否能正常工作?
如果鏈表只包含兩個結點時,代碼是否能正常工作?
代碼邏輯在處理頭結點和尾結點的時候,是否能正常工作?
3、棧
leetcode上關于棧的題目大家可以先做20,155,224,232,496,682,844.
表達式求值:
其中一個保存操作數的棧,另一個是保存運算符的棧。我們從左向右遍歷表達式,當遇到數字,我們就直接壓入操作數棧;當遇到運算符,就與運算符棧的棧頂元素進行比較:如果比運算符棧頂元素的優先級高,就將當前運算符壓入棧;如果比運算符棧頂元素的優先級低或者相同,從運算符棧中取棧頂運算符,從操作數棧的棧頂取 2 個操作數,然后進行計算,再把計算完的結果壓入操作數棧,繼續比較。
括號匹配:
我們用棧來保存未匹配的左括號,從左到右依次掃描字符串。當掃描到左括號時,則將其壓入棧中;當掃描到右括號時,從棧頂取出一個左括號。如果能夠匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,則繼續掃描剩下的字符串。如果掃描的過程中,遇到不能配對的右括號,或者棧中沒有數據,則說明為非法格式。當所有的括號都掃描完成之后,如果棧為空,則說明字符串為合法格式;否則,說明有未匹配的左括號,為非法格式。
4、隊列:
5、字符串
6、哈希表