原创 劍指offer-兩個鏈表的第一個公共節點-JavaScript

題目描述:輸入兩個鏈表,找出它們的第一個公共節點。 解法 1: 遍歷+哈希表記錄 比較容易想到的思路: 開闢哈希表 map。key 是節點,value 是 boolean,代表節點是否出現過 對 list1 進行遍歷,設置 map[節點]

原创 劍指offer-數組中的逆序對-JavaScript

題目描述:在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數。 解法 1: 暴力法(TLE) 直接雙重循環,挨個檢查是否爲逆序對。代碼實現比較簡單: /** * @p

原创 劍指offer-連續子數組的最大和:動態規劃及優化、貪心法、分治法(JavaScript實現)

雖然這題在 leetcode 上標註的是「簡單」難度,但是解法有 4 種,並且都非常具有代表性。比較容易想到的是基礎的動態規劃法。 解法 1:動態規劃 定義狀態數組dp[i]的含義:數組中元素下標爲[0, i]的連續子數組最大和。 狀態轉移

原创 劍指offer-醜數:動態規劃+最小堆(JavaScript實現)

題目描述:我們把只包含因子 2、3 和 5 的數稱作醜數(Ugly Number)。求按從小到大的順序的第 n 個醜數。 解法 1: 動態規劃 因爲醜數只包含質因數 2, 3, 5,所以對於下個醜數來說,一定是前面某個醜數乘 3、乘 4 或

原创 劍指offer-最長不含重複字符的子字符串-JavaScript

題目描述:請從字符串中找出一個最長的不包含重複字符的子字符串,計算該最長子字符串的長度。 題目分析 留意最長子串和子序列不是一個概念。例如對“pwwkew”來說,最長子串是“wke”,“pwke”是其中一個子序列。 在不考慮時間的情況下,直

原创 劍指offer-禮物的最大價值-JavaScript

題目描述:在一個 m*n 的棋盤的每一格都放有一個禮物,每個禮物都有一定的價值(價值大於 0)。你可以從棋盤的左上角開始拿格子裏的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。給定一個棋盤及其上面的禮物的價值,請計算你最多能拿到多

原创 LeetCode 1038.從二叉搜索樹到更大和樹

📖博客原文 :《LeetCode 1038.從二叉搜索樹到更大和樹 - JavaScript》 給出二叉搜索樹的根節點,該二叉樹的節點值各不相同,修改二叉樹,使每個節點 node 的新值等於 原樹中大於或等於 node.val 的值之和

原创 LeetCode 461.漢明距離

📖博客原文 :《LeetCode 461.漢明距離 - JavaScript》 漢明距離定義:兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。 題目描述:給出兩個整數 x 和 y,計算它們之間的漢明距離。 注意: 0

原创 LeetCode 211.添加與搜索單詞(數據結構設計)

📖Blog :《LeetCode 141.環形鏈表 - JavaScript》 題目描述:給定一個鏈表,判斷鏈表中是否有環。 解法 1:Floyd 判圈算法 Floyd 判圈算法類似龜兔賽跑,需要用到快指針 fast 和慢指針 slo

原创 LeetCode 297.序列化二叉樹 - JavaScript

題目描述 序列化是將一個數據結構或者對象轉換爲連續的比特位的操作,進而可以將轉換後的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,採取相反方式重構得到原數據。 請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限

原创 LeetCode 101.對稱二叉樹 - JavaScript

題目描述:給定一個二叉樹,檢查它是否是鏡像對稱的。 題目分析 下面這種二叉樹就是鏡像對稱的,符合題目要求: 1 / \ 2 2 / \ / \ 3 4 4 3 解法 1:遞歸檢查 根據題目“對稱”的定義,遞歸過

原创 劍指offer - 順時針打印矩陣 - JavaScript

題目描述 輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下 4 X 4 矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字 1,2,3,4,8,12,16,

原创 劍指offer - 棧的壓入彈出序列 - JavaScript

題目描述 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列 1,2,3,4,5 是某棧的壓入順序,序列 4,5,3,2,1 是該壓棧序列對應的一個彈出序列,但 4

原创 LeetCode 79.單詞搜索 - JavaScript

題目描述:給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。 例子: board = [

原创 LeetCode 343.整數拆分 - JavaScript

題目描述:給定一個正整數 n,將其拆分爲至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 題目分析 題目中“n 至少可以拆分爲兩個正整數的和”,這個條件說明了 n 是大於 1 的整數。 對 7 來說,可以拆成 3