原创 哈希表

      哈希表充分體現了算法設計領域的經典思想:空間換時間。   ①哈希函數的設計:“鍵”通過哈希函數得到的“索引”分佈越均勻越好。 對整型: 小範圍正整數直接使用。 小範圍負整數可以進行偏移爲正整數。 大整數,可以通過取模的方式,

原创 紅黑樹

目錄 紅黑樹 2-3樹 紅黑樹 紅黑樹 2-3樹 基於二分搜索樹(二叉查找樹),實現的一棵絕對平衡的樹。  參考:二分搜索樹 注:二叉查找樹是向下生長,而2-3樹是向上生長。 目的:爲了解決二分搜索樹的不平衡性(二分搜索樹在最壞情況下可能

原创 LeetCode之387. 字符串中的第一個唯一字符

參考知識:哈希表   題目描述: 給定一個字符串,找到它的第一個不重複的字符,並返回它的索引。如果不存在,則返回 -1。 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2.   注意

原创 自定義AVL樹(1)

通過學習自定義平衡二叉樹,瞭解平衡二叉樹這一數據結構。 AVL樹是以二分搜索樹爲基礎的改進。參考:二分搜索樹 之前的線段樹、堆(基於完全二叉樹)都是平衡二叉樹。   平衡二叉樹,又稱AVL樹,它是一種特殊的二分搜索樹(或叫二叉排序樹)。A

原创 自定義AVL樹(2):實現集合(Set)與映射(Map)

通過AVL樹的方式實現自定義集合(Set)和自定義映射(Map)。   參考:自定義集合(Set)          Set.java 參考:自定義映射(Map)        Map.java 參考:自定義AVL樹           

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

參考知識: 字典樹(前綴樹)   題目描述: 設計一個支持以下兩種操作的數據結構: void addWord(word) bool search(word) search(word) 可以搜索文字或正則表達式字符串,字符串只包含字母 

原创 LeetCode之303. 區域和檢索 - 數組不可變

參考知識:線段樹 (但本題其實是一個不可變數組,所以可以不用線段樹)   題目描述: 給定一個整數數組  nums,求出數組從索引 i 到 j  (i ≤ j) 範圍內元素的總和,包含 i,  j 兩點。 示例: 給定 nums = [

原创 LeetCode之208. 實現 Trie (前綴樹)

參考知識: 字典樹(前綴樹)     題目描述: 實現一個 Trie (前綴樹),包含 insert, search, 和 startsWith 這三個操作。 示例: Trie trie = new Trie(); trie.inse

原创 自定義字典樹(前綴樹)

通過學習自定義字典樹,瞭解字典樹這一數據結構。   之前的二分搜索樹(二叉樹)、堆(完全二叉樹)、線段樹(平衡二叉樹)都是基於二叉樹。而字典樹是一種多叉樹。     如果有n個條目,使用樹結構查詢的時間複雜度爲O(log n),如果有1

原创 自定義線段樹(區間樹)

通過學習自定義線段樹(區間樹),瞭解線段樹這一數據結構。 線段樹首先是平衡二叉樹。   用例:查詢一個區間[i,j]的最大值,最小值,或者區間數字和等。 實質:基於區間的統計查詢。 爲什麼用線段樹:   使用數組實現 使用線段樹

原创 自定義並查集

一種特殊的多叉樹。 主要支持兩個方法:①union(p,q)  ②isConnected(p,q)     find方法中的路徑壓縮:       基於rank的優化:               以 union(4,2)爲例: 將層數

原创 LeetCode之347. 前K個高頻元素

參考知識:優先隊列      (通過最大堆實現的) 優先隊列的作用是能保證每次取出的元素都是隊列中權值最小的(Java的優先隊列每次取最小元素)。這裏牽涉到了大小關係,元素大小的評判可以通過元素本身的自然順序(natural orderi

原创 自定義堆(2):通過堆實現優先隊列

學習堆、優先隊列之間的關係。   普通隊列:先進先出;後進後出。 優先隊列:出隊順序和入隊順序無關,和優先級相關。     入隊 出隊(拿出最大元素) 之前自定義的普通線性結構 O(1) O(n) 之前自定義的順序線性結構 O(n) O(

原创 自定義堆(1):實現最大堆

通過學習自定義堆,瞭解堆的數據結構。  本篇以最大堆爲例。 底層依賴了自定義數組,  參考:自定義數組   中的   Array.java 所以,其時間複雜度分析: add O(log n) extractMax O(lo

原创 LeetCode之349. 兩個數組的交集

運用的知識:集合   。   參考:自定義集合(Set)   題目描述: 給定兩個數組,編寫一個函數來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2] 示例 2: