原创 leetcode 116

本題想要將樹內部的節點連接起來。這題的想法可以用BFS得到每層的節點,然後相連。也可以用DFS遞歸的方式去做。本人採用遞歸的方式處理該問題。爲了能夠進行內部連接,我們需要額外得到每棵樹的最左邊一排節點和最右邊一排節點。因此重新定義函數額外

原创 LeetCode 513

此題要找到一個二叉樹最後一行的最左邊的值。 由於是樹狀結構,通常採用遞歸的方式去求解。因爲我們想要得到最深處的最左邊的值,所以在返回值的同時,還需要記錄一下左右子樹的深度,來幫助判斷哪邊纔是我們需要的值。因此重新定義個函數depthAnd

原创 Leetcode 559

水題,遞歸遍歷childern,判斷高度最大的那個返回即可。 代碼如下: """ # Definition for a Node. class Node(object): def __init__(self, val, chil

原创 leetcode 105

這題和之前根據後序遍歷和中序遍歷找樹的題目一樣,都是根據前序或者後序來找到根節點的值,然後再根據中序遍歷找到root,從而將左右子樹進行劃分,然後遞歸的進行求解。 代碼如下: # Definition for a binary tree

原创 Leetcode 495

此題主要是根據中毒時間序列以及每次毒持續多少時間,來計算出總的中毒時間爲多少。主要分兩種情況,一種是在中毒結束前下一次中毒還沒有到來,另一種是在中毒結束前就來了新的中毒。假設新來的中毒時間點爲 point, 那麼前者總的中毒時間需要加上

原创 Leetcode LCP 1

超級水題 代碼如下: class Solution(object): def game(self, guess, answer): """ :type guess: List[int]

原创 Leetcode 11

此題是一道非常經典的算法題。給定一系列高度的橫線,算其所能圍成的盛水容器的面積最大多少。可以直觀地發現整個盛水面積是與兩個橫線之間的距離以及他們的最小高度決定的。 一個非常直觀的想法是遍歷兩兩線段,取最大的面積,但是這樣做很明顯是超時的,

原创 算法技巧之滑動窗口

在算法題目中,經常會遇到給定一個數組,找出符合某種特性的連續子數組。這時候可以採用滑動窗口的方法。 例如,給定數組A = [1,1,3,2,1,0,2],找出滿足和小於等於5的最長連續子數組。 採用暴力的方法,需要用一層循環枚舉子數組的起

原创 Leetcode 343

此題的子結構還是非常容易發現的,給定一個正整數,將其劃分成n個正整數之和,使其的乘積最大。一種直觀的子結構就是 遍歷1到n,把max(i * dp(n-i))找到。其中一個小陷阱是,由於在做dp的時候默認n-i是一定要劃分成多個部分的,所

原创 算法技巧之計算二維數組區域和

在做算法題目的過程中,經常會遇到二維數組的題目,並且要以二維數組的任意矩形區域的和作爲先驗知識來進行之後的推算。 例如:已知大小M*N的矩陣A,求矩陣內任意矩形區域的和。 如果採用暴力搜索的方式,則需要O(M^2N^2)的時間複雜度,即需

原创 Leetcode 171周賽

第一次參加周賽,共有4題,一個半小時。一題easy,兩題medium, 一題hard。ac了前三題。 1. 是將整數轉換成兩個無零整數的和。這題的關鍵是如何判斷一個整數有沒有零。此處本人是採用將整數轉換成string類型來查找有沒有'0'

原创 leetcode 279

此題的想法也是遞歸,就是想如何拆分成子問題。由於子問題大量重複,所以定義個數組來記錄一下中間的結果,也就是記憶化dp。子問題很好定義,給定一個數,我們找它所對應的最大平方根整數。那麼對於該數所對應的所有結果,都是1到這個最大平方根內的所有

原创 leetcode 106

此題爲根據中序遍歷和後序遍歷構造樹。是一道經典題目,採用遞歸的方法。 首先根據後序遍歷的性質可以得知,後序遍歷的最後一個值一定是根節點。因此我們找到根節點在中序遍歷的位置,根據中序遍歷的性質可以得知,根節點所在位置的左邊全都是根節點的左子

原创 LeetCode 114

mark,好題目! 題目要求將一個二叉樹按照前序遍歷的方式展開成一個新樹,要求就在此棵樹上面進行修改,也就是不能佔用額外的空間。遞歸是直觀的解法,但是會佔用額外的存儲空間,因爲每一層遞歸都會保留左右子樹相關的信息,空間複雜度不是常數。 可

原创 leetcode 207

此題想法非常簡單,就是用拓撲排序,如果能夠排完,則存在一個有序的排列,否則的話就有循環。代碼如下: class Solution(object): def canFinish(self, numCourses, prerequi