原创 Stack的應用——Binary Tree Preorder Traversal

問題描述: 給定一個二叉樹,返回其節點值的前序遍歷。採用迭代的方法。 解題思路: 前序遍歷的法則是: 訪問一個節點; 訪問它的左子樹; 訪問它的右子樹; 根據法則可以得到如下算法: 訪問當前節點是否有左子樹 if 有左子樹     

原创 分而治之——Different Ways to Add Parentheses

問題描述: 給定一個含有數字和運算符的字符串,用所有不同的可能的方法計算所有可能的結果。 有效的運算符是+, - 和*。 解題思路: Input: "2*3-4*5" (2*(3-(4*5))) = -34 ((2*3)-(4*5)

原创 Stack的應用——Decode String

題解: 1.問題描述:給定一個編碼字符串,返回它的解碼字符串。編碼規則是:k [encoded_string],其中方括號內的encoded_string被重複k次。 注意,k被保證爲正整數。 2.解題思路: s = "3[a2[c]]"

原创 Binary Tree Inorder Traversal

問題描述: 給定一棵二叉樹,返回它的中序遍歷。 解題思路: 中序遍歷的法則: 遍歷左子樹 訪問當前元素 遍歷右子樹 根據中序遍歷的法則,可以得到相應的算法: 聲明一個棧用來存儲還沒遍歷到的節點,而且從棧頂到棧底是向根部回推的一個

原创 Stack的應用——Verify Preorder Serialization of a Binary Tree

問題描述: 給定一個用逗號分隔的字符串,驗證它是否是二叉樹的正確的前序遍歷序列。 找到一個不用重建樹的算法。字符串中的每兩個逗號之間必須是整數或表示空指針的字符'#'。 解題思路: Example 1:"9,3,4,#,#,1,#,#,2

原创 Longest Palindromic Subsequence

問題描述: 給定字符串s,找到s中最長迴文子序列的長度。你可以假設最長迴文子序列的長度爲1000。 解題思路: 聲明一個二維數組p[i][j],表示從i到j間的最長迴文子序列的長度。 Example 1: Input: "bbbab"

原创 Word Break

問題描述: 給定一個非空的字符串,和包含一系列非空單詞的詞典worddict,確定s是否是一個可以分割成一個或多個字典裏的單詞的序列。你可以假設字典裏不包含重複的單詞。 解題思路: 設布爾數組v[i]表示由s中前i個字符組成的字符串是否可

原创 FAS問題

題目:來自《算法概論》8.22 解: (a)判斷一個問題是不是NP問題,要看所給出的實例能不能在多項式時間內驗證出來。          在這道題中,我們需要驗證一個解E'是不是FAS的解。判斷條件如下:         (1)|E'|<

原创 Longest Increasing Subsequence

問題描述: 給定一個無序的數組,找到最長遞增子序列的長度。 解題思路: 將LIS問題轉化爲dag上的最長路問題。用dp[j]表示以第j個數結尾的最長遞增子數列的長度。 轉化方式:將每個數作爲一個結點. 從結點u到結點v連一條邊,當且僅當u

原创 Minimum Path Sum

問題描述: 給定一個充滿非負數的m x n網格,從左上到右下找到一條路徑,使路徑的所有數的總和最小。 解題思路: 和上一題類似,也是考慮從(0,0)到(i,j)的最後一步。無非有兩種可能,向下或者向右。所以我們可以分別計算出這兩種情況的數

原创 EASY——Two Sum

問題描述: 給定一個整數數組,返回兩個數字的索引,使它們相加到一個特定的目標。你可以假設每個輸入都只有一個解決方案,而你不會使用相同的元素兩次。 解題思路: 爲了避免重複考慮,每次只考慮當前元素和在該元素後面的元素的配對。 源代碼: cl

原创 Integer Break

問題描述: 給定一個正整數n,將其分解爲至少兩個正整數之和,並使這些整數的乘積最大化。返回你能得到的最大乘積。 解題思路: 根據給出的這兩個提示,我們可以很容易的寫出如下的特例情況: 7=2+2+3 8=2+3+3 9=3+3+3 1

原创 DP——Arithmetic Slices

題目描述: 給定一個數列,找到所包含的等差數列的數量 解題思路: 還是以往的思路,聲明一個dp數組,dp[i]用來存儲到第i+1個元素已包含的等差數列數量。現在考慮dp[i]和dp[i+1]之間的關係,如果新加進來的數可以和前面的數構成等

原创 DP——Maximum Subarray

問題描述: 在數組中找到連續的子列(包含至少一個數字),使其和最大。 解題思路: 聲明一個sum數組,用來記錄當前連續子列的最大和。key:如果當前元素加上sum[i-1],比本身的數值要小的話,則選取當前元素的數值作爲sum[i] 源代

原创 DP——House Robber

問題描述: 給定一列非負數,找到不相鄰的數的最大和。 解題思路: 聲明一個數組dp,dp[i]表示到數組的第i個元素爲止不相鄰的數能組合成的最大和。比如,給定數列{2,7,1,9},dp[0]=2,到dp[1],因爲不能選相鄰的數,所以d