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