3/22更新
劍指offer
建議大部分題都會做,都能比較快速且準確的寫出來。關於做題方式,我的建議是:一道一道刷即可,因爲難度一般,不用系統的學習什麼知識,遇到實在不會的就跳過即可。
我這裏寫了大概80%的題,剩下的題我個人感覺沒什麼意思或者很難說思路,就沒有寫了。
劍指offer:3-7:找出重複數字/二維遞增數組查詢/空格替換%20/返回順序相反的鏈表數組/前序中序重建二叉樹
劍指offer:8-11:棧模擬隊列/斐波那契/上臺階/搜索旋轉數組
劍指offer:12-17:矩陣是否包含字符串/(整數拆分)剪m段繩子最大乘積/快速冪/
劍指offer:18-21:刪除鏈表節點/實現正則/判斷是否是數字/奇偶排序
劍指offer:22-25:鏈表倒k節點/反轉鏈表/合併鏈表
劍指offer:26-30:判斷樹子結構/二叉樹鏡像/二叉樹是否對稱/順時針打印矩陣/min棧
劍指offer:33-37:判斷二叉搜索樹後序序列/打印二叉樹sum路徑/copy random/二叉樹序列化反序列化
劍指offer:39-42:出現超一半的數/最小k個數/數據流中位數/最大子數組
劍指offer:45-48:貪心拼最小數/數字翻譯爲字母的方法數(dp)/向右向下的最優解(dp)/最長不重複子串(dp)
劍指offer:50-53:第一個出現一次/逆序對數量/找鏈表交點/在排序數組出現的次數(二分)/0-n-1範圍未出現數字(二分,異或)
劍指offer:55-58:二叉樹深度/判斷平衡二叉樹/和爲s的兩個數/翻轉句子/部分反轉句子
劍指offer:63-66:股票賣一次最大利潤/不用*/、判斷、循環實現1+2+n/不用+-*/求和/除自己之外的乘積
二分
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法,前提是數據結構必須先排好序,可以在數據規模的對數時間複雜度內完成查找。但是,二分查找要求線性表具有有隨機訪問的特點(例如數組),也要求線性表能夠根據中間元素的特點推測它兩側元素的性質,以達到縮減問題規模的效果。
二分查找問題也是面試中經常考到的問題,雖然它的思想很簡單,但寫好二分查找算法並不是一件容易的事情。
leetcode34. 在排序數組中查找元素的第一個和最後一個位置
leetcode74. 搜索二維矩陣 ,你見過嗎(leetcode240. 搜索二維矩陣 II)
位運算
位操作(Bit Manipulation)是程序設計中對位模式或二進制數的一元和二元操作。在許多古老的微處理器上,位運算比加減運算略快,通常位運算比乘除法運算要快很多。在現代架構中,情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算)。
位操作包括:¬ 取反(NOT)、∩ 按位或(OR)、⊕ 按位異或(XOR)、∪ 按位與(AND)
移位:移位是一個二元運算符,用來將一個二進制數中的每一位全部都向一個方向移動指定位,溢出的部分將被捨棄,而空缺的部分填入一定的值。
移位又分爲算術移位、邏輯移位
leetcode52. N皇后 II 最強解法直接秒殺100%
數組操作
數組是在程序設計中,爲了處理方便,把具有相同類型的若干元素按有序的形式組織起來的一種形式。抽象地講,數組即是有限個類型相同的元素的有序序列。若將此序列命名,那麼這個名稱即爲數組名。組成數組的各個變量稱爲數組的分量,也稱爲數組的元素。而用於區分數組的各個元素的數字編號則被稱爲下標,若爲此定義一個變量,即爲下標變量。
leetcode448. 找到所有數組中消失的數字 天秀記錄法
鏈表
鏈表(Linked List)是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在每一個節點裏存到下一個節點的指針(Pointer)。
由於不必須按順序存儲,鏈表在插入的時候可以達到 O(1)的複雜度,比另一種線性表 —— 順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要 O(n) 的時間,而順序表相應的時間複雜度分別是 O(log n) 和 O(1)。
使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。
在計算機科學中,鏈表作爲一種基礎的數據結構可以用來生成其它類型的數據結構。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(data fields)和一或兩個用來指向上一個/或下一個節點的位置的鏈接(links)。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁盤上順序,數據的訪問往往要在不同的排列順序中轉換。而鏈表是一種自我指示數據類型,因爲它包含指向另一個相同類型的數據的指針(鏈接)。
鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。
鏈表通常可以衍生出循環鏈表,靜態鏈表,雙鏈表等。對於鏈表使用,需要注意頭結點的使用。
leetcode237 刪除鏈表中的節點(你意想不到的做法,注意細節)
leetcode1290. 二進制鏈表轉整數 刷新認知,最簡單算法題
雙指針
類型1:兩指針中間夾的就是一個符合標準的答案,通過某種邏輯移動兩個指針,擴大或縮小答案範圍,最終找到最優解
類型2:快慢指針,可以應用在判斷是否有環,或對空間要求高的合併等操作。
leetcode167. 兩數之和 II - 並沒有那麼easy的easy題
leetcode170. 兩數之和 III - 數據結構設計
leetcode209. 長度最小的子數組 借這個題規範一下雙指針寫法
leetcode340. 至多包含 K 個不同字符的最長子串
貪心
貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
動態規劃
動態規劃(英語:Dynamic programming,簡稱 DP)是一種在數學、管理科學、計算機科學、經濟學和生物信息學中使用的,通過把原問題分解爲相對簡單的子問題的方式求解複雜問題的方法。
動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。
動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。動態規劃往往用於優化遞歸問題,例如斐波那契數列,如果運用遞歸的方式來求解會重複計算很多相同的子問題,利用動態規劃的思想可以減少計算量。
通常許多子問題非常相似,爲此動態規劃法試圖僅僅解決每個子問題一次,具有天然剪枝的功能,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個子問題解之時直接查表。這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用。
leetcode10. 正則表達式匹配 一道沒有解釋的字符串dp困難題
leetcode44. 通配符匹配 又是一道沒有解釋的字符串dp困難題
leetcode96. 不同的二叉搜索樹 動歸vs數學?
leetcode119. 楊輝三角 II 你能比我代碼更短嗎?
二叉樹
樹是一種抽象數據類型(ADT)或是實現這種抽象數據類型的數據結構,用來模擬具有樹狀結構性質的數據集合。它是由 n(n>0)n(n>0) 個有限節點組成一個具有層次關係的集合。
把它叫做「樹」是因爲它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。
它具有以下的特點:
每個節點都只有有限個子節點或無子節點;
沒有父節點的節點稱爲根節點;
每一個非根節點有且只有一個父節點;
除了根節點外,每個子節點可以分爲多個不相交的子樹;
樹裏面沒有環路。
leetcode117. 填充每個節點的下一個右側節點指針 II
leetcode145. 二叉樹的後序遍歷 意想不到的騷操作
leetcode 222. 完全二叉樹的節點個數
字符串處理
leetcode205. 同構字符串 一般人一次做不對的簡單題
leetcode243. 最短單詞距離(vip題)好像挺簡單?
矩陣DFS
深度優先搜索算法(英語:Depth-First-Search,DFS)是一種用於遍歷或搜索樹或圖的算法。沿着樹的深度遍歷樹的節點,儘可能深的搜索樹的分支。當節點v的所在邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點爲止。如果還存在未被發現的節點,則選擇其中一個作爲源節點並重復以上過程,整個進程反覆進行直到所有節點都被訪問爲止。屬於盲目搜索。
深度優先搜索是圖論中的經典算法,利用深度優先搜索算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。
因發明「深度優先搜索算法」,約翰 · 霍普克洛夫特與羅伯特 · 塔揚在1986年共同獲得計算機領域的最高獎:圖靈獎。
leetcode79. 單詞搜索 網格地圖搜索+回溯經典寫法啦
leetcode329. 矩陣中的最長遞增路徑
在一維DFS
並查集
在計算機科學中,並查集是一種樹型的數據結構,用於處理一些不交集(Disjoint Sets)的合併及查詢問題。有一個聯合-查找算法(Union-find Algorithm)定義了兩個用於此數據結構的操作:
Find:確定元素屬於哪一個子集。它可以被用來確定兩個元素是否屬於同一子集。
Union:將兩個子集合併成同一個集合。
由於支持這兩種操作,一個不相交集也常被稱爲聯合-查找數據結構(Union-find Data Structure)或合併-查找集合(Merge-find Set)。
爲了更加精確的定義這些方法,需要定義如何表示集合。一種常用的策略是爲每個集合選定一個固定的元素,稱爲代表,以表示整個集合。接着,Find(x) 返回 x 所屬集合的代表,而 Union 使用兩個集合的代表作爲參數。
隊列/棧
棧(Stack)又名堆棧,它是一種重要的數據結構。從數據結構角度看,棧也是線性表,其特殊性在於棧的基本操作是線性表操作的子集,它是操作受限的線性表,因此,可稱爲限定性的數據結構。限定它僅在表尾進行插入或刪除操作。表尾稱爲棧頂,相應地,表頭稱爲棧底。棧的基本操作除了在棧頂進行插入和刪除外,還有棧的初始化,判空以及取棧頂元素等。
隊列(Queue)是一種先進先出(FIFO,First-In-First-Out)的線性表。
在具體應用中通常用鏈表或者數組來實現。隊列只允許在後端(稱爲 rear)進行插入操作,在前端(稱爲 front)進行刪除操作。
隊列的操作方式和堆棧類似,唯一的區別在於隊列只允許新數據在後端進行添加。
隊列常用的方法有:add、remove、element、offer、poll、peek、put、take。
數學
數學是利用符號語言研究數量、結構、變化以及空間等概念的一門學科,從某種角度看屬於形式科學的一種。數學透過抽象化和邏輯推理的使用,由計數、計算、量度和對物體形狀及運動的觀察而產生。數學家們拓展這些概念,爲了公式化新的猜想以及從選定的公理及定義中建立起嚴謹推導出的定理。
基礎數學的知識與運用是個人與團體生活中不可或缺的一環。對數學基本概念的完善,早在古埃及、美索不達米亞及古印度內的古代數學文本便可觀見,而在古希臘那裏有更爲嚴謹的處理。從那時開始,數學的發展便持續不斷地小幅進展,至 16 世紀的文藝復興時期,因爲新的科學發現和數學革新兩者的交互,致使數學的加速發展,直至今日。數學併成爲許多國家及地區的教育範疇中的一部分。
今日,數學使用在不同的領域中,包括科學、工程、醫學、經濟學和金融學等。數學對這些領域的應用通常被稱爲應用數學,有時亦會激起新的數學發現,並導致全新學科的發展,例如物理學的實質性發展中建立的某些理論激發數學家對於某些問題的不同角度的思考。數學家也研究純數學,就是數學本身的實質性內容,而不以任何實際應用爲目標。雖然許多研究以純數學開始,但其過程中也發現許多應用之處。
leetcode2 兩數相加
leetcode96. 不同的二叉搜索樹 動歸vs數學?
博弈
SQL
大部分是付費題目,可以看我的做題記錄,目前做了一半(50題),另一半我覺得做出來對我個人的提升較小了,所以暫時沒有做。
leetcode184. 部門工資最高的員工(SQL) 連接+嵌套查詢
leetcode570. 至少有5名直接下屬的經理(SQL)
leetcode597. 好友申請 I :總體通過率(SQL)
leetcode1050. 合作過至少三次的演員和導演(SQL)
多線程
這一部分要了解,知道自己使用的語言的併發工具,再懂一點點操作系統的多線程知識,就可以做了,但是數量不多。
(多線程)leetcode1114. 按序打印 認識AtomicInteger
(多線程)leetcode1115. 交替打印FooBar 記得Thread.yield();
(多線程)leetcode1117. H2O 生成 認識Java中的PV原語
(多線程)leetcode1195. 交替打印字符串 最簡單解法一個變量搞定
shell
用到的可以瞭解一下。