原创 Leetcode : Regular Expression Matching

對於leetcode上這個題目,我用了不少時間來消化。 題目大意如下: 實現兩個字符串s,t的匹配,其中t字符串中的 ‘.’ 能匹配任何一個字符. ‘*’ 能充當0個或者多個前面一個字符. 匹配結果要覆蓋整個字符串 幾個

原创 編程珠璣——快速排序總結

快速排序 快速排序是二十世紀最偉大的10大算法之一。如何寫好一個快速排序通常不是一件容易的事,同時面試中或者實際應用中也經常要用到快速排序。 編程珠璣第11章專門介紹了快速排序,涉及到了基本的算法思想實現和一些優化,這裏進行簡單的

原创 BigInteger類實例的構造過程——JDK源碼解析

        最近看了下JDK1.6版本的BigInteger類,仔細研究了下大整數實例的構造過程,現在把自己的所得所想分享給大家.             首先,爲什麼需要大整數類?簡單的說就是因爲內部的數據類型能表示的最大數是64位

原创 二叉樹的遍歷

二叉樹的遍歷 二叉樹是一種常用並且重要的數據結構,其是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”。二叉樹中一個比較常用的操作是遍歷二叉樹。 所謂遍歷(Traversal)是指沿着某條搜索路線,依次對樹中

原创 窗口有關算法題目

窗口算法 窗口算法是我自己起的不嚴謹的名字,因爲最近做了幾個leetcode中幾個算法題目,發現其算法的都需要通過維護一個窗口來實現,說到窗口,我們肯定會想到TCP/IP中的滑動窗口協議,其實這類算法題目和這個有點神似的。 滑動

原创 Morris方法遍歷二叉樹

本文主要解決一個問題,如何實現二叉樹的前中後序遍歷,有兩個要求: O(1)空間複雜度,即只能使用常數空間; 二叉樹的形狀不能被破壞(中間過程允許改變其形狀)。 通常,實現二叉樹的前序(preorder)、中序(inorder)

原创 常用位運算算法題目

常用位運算算法題目 位運算操作簡單,高效,可以提升算法編程的效率,下面讓我們討論幾個常用的位運算算法。 求二進制中1的個數 這個題目有在編程之美里面出現,最基本的思路就是一個數除以2,原來的二進制數目會減少一個,若是除的過程中有

原创 Trie——字典樹

字典樹 首先看下百度百科的定義. 字典樹 是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計,排序和保存大量的字符串(但不僅限於字符串),所以經常被搜索引擎系統用於文本詞頻統計。它的優點是:利用字符串的公共前綴來減少查詢時間

原创 拓撲排序

拓撲排序 拓撲排序的定義 對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u在線性序列中出現在

原创 LCA-最小公共父節點

有一個普通二叉樹,AB分別爲兩個子節點,求AB最近(深度最大)的公共父節點。 此題仍然是一個老題,有着多種解決方法,本文針對其中三種方法來進行分析總結。 這三種方法分別是:遞歸法,tarjan離線算法,RMQ在線算法。 遞歸法

原创 最長迴文子串

最長迴文子串 題意:給定一個字符串s,找出該字符串中最長的迴文子串。 字符串如“abcba”,”abbbba”這樣呈中心對稱的子串稱爲迴文串。該題目是一個老題了,有多種不同的解法,我整理一下方便以後查詢。 暴力動態規劃法 這個方

原创 RMQ-區間最值問題

區間最值詢問是求給定區間最值的問題。若總區間爲[1,N],通常是有多次查詢,每次查詢是不同的總區間的子區間。 簡單的方法是對每個子區間遍歷從而找到最值,時間複雜度是O(N),但是如果有多次的查詢,效率就會很低。而解決這個問題的一個

原创 不相交集合-並查集

並查集的定義 不相交集合維護了一個不相交動態集的集合。我們用一個代表來標示每個集合,而這個代表是這個集合的某個成員。 該集合中最主要的兩個操作Union(合併)與Find(查詢),因此該數據結構也叫做並查集。讓我們看一下百度百科

原创 KMP算法小總結

算法介紹 字符串匹配是編程常遇到的一個問題,最樸素簡單粗暴的匹配方法需要O(n2) 的時間複雜度,這顯然滿足不了算法大神的要求。 KMP算法是一種改進的快速的字符串匹配算法,是由D.E.Knuth與V.R.Pratt和J.H.Mo

原创 數組中第K大元素

數組中第K大元素 在面試的時候遇到過這個問題,後來在leetcode上也遇到了這個問題,於是記錄下來以便以後快速回憶。 題目有多種思路,全排序是比較直觀的想法,然而最低的時間複雜度爲O(nlgn),並且不符合該題目的初衷。 題目更