【算法】哈希表 ( 两数之和 )
算法 系列博客
【算法】刷題范圍建議 和 代碼規范
【算法】復雜度理論 ( 時間復雜度 )
【字符串】最長回文子串 ( 蠻力算法 )
【字符串】最長回文子串 ( 中心線枚舉算法 )
【字符串】最長回文子串 ( 動態規劃算法 ) ★
【字符串】字符串查找 ( 蠻力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )
【算法】雙指針算法 ( 雙指針算法分類 | 相向雙指針 | 有效回文串 )
【算法】雙指針算法 ( 有效回文串 II )
【算法】哈希表 ( 兩數之和 )
文章目錄
- 算法 系列博客
- 一、兩數之和
使用哈希表解決問題 , 一般不需要手動實現哈希表 , 一般使用 HashSet 或 HashMap 即可 ;
一、兩數之和
兩數之和 : https://www.lintcode.com/problem/56/
給定一個未排序的數組 , 找到數組中的兩個元素之和 , 等于給定的 target 值 ;
該問題最直觀的解法 , 就是 蠻力算法 ;
如 : 給定數組 [6, 4, 2, 9] , 給定 target 值為 10 , 找出數組中哪兩個元素之和為 10 ;
如果使用蠻力算法 , 就是遍歷所有的數組元素 , 如 遍歷 6 , target ( = 10 )減去該被遍歷的元素 , 結果是 4 , 然后檢測 4 在不在數組中 ;
這樣需要設計 兩層循環 , 外層循環遍歷數組元素 , 內層循環遍歷 target - 數組元素 值是否在數組中 ;
上述算法事件復雜度為 O(n2)O(n^2)O(n2) ;
這里的內層循環中 , 檢測一個數字是否在數組中 , 可以使用 哈希表 進行實現 , 哈希表查詢的單次操作的時間復雜度是 O(1)O(1)O(1) , nnn 次查詢的操作是 O(n)O(n)O(n) ;
哈希表在該算法中 , 既不是輸入 , 也不是輸出 , 是算法計算過程中的耗費 , 因此其空間復雜度是 O(n)O(n)O(n) ;
哈希表的 時間復雜度是 O(n)O(n)O(n) , 空間復雜度是 O(n)O(n)O(n) ;
哈希表存使用 HashMap 集合體現 ;
設計一個循環 , 遍歷數組元素 number ; 遍歷時檢測 target - number 是否在HashMap中 , 如果不在 , 則加入到哈希表中 ;
將 target - number 的值作為 HashMap 集合的 Key 鍵 , 將該 number 的索引作為 Value 值 ;
上述操作 , 一邊遍歷 , 一邊將數組元素插入到哈希表中 , [3, 6, 2, 4] , 在遍歷到 6 時 , 從哈希表中查找 10 - 6 = 4 這個值 , 哈希表中沒有 4 , 但此時將 4=2 鍵值對 插入了 HashMap , 在之后遍歷 4 時 , 肯定能找到索引值 2 ;
按照這種遍歷方式 , 如果存在這兩個元素 , 總能在 O(n)O(n)O(n) 時間內找到兩個值
代碼示例 :
import java.util.HashMap;class Solution {public int[] twoSum(int[] numbers, int target) {// 鍵存放 target - numbers[i], 值存放對應的 i 索引值// 如果正在遍歷的 numbers[j], 恰好等于某個 target - numbers[i]// 說明 i, j 就是要找的兩個索引值HashMap<Integer, Integer> hashMap = new HashMap<>();// 要返回的值int[] result = new int[2];for (int i = 0; i < numbers.length; i++) {if (hashMap.get(numbers[i]) != null) {// 如果集合中有該值, 說明已經找到了兩數之和為 target 的兩個元素了, 可以直接返回result[0] = hashMap.get(numbers[i]);result[1] = i;return result;}// 向哈希表中存儲 target - numbers[i]hashMap.put(target - numbers[i], i);}return result;} }class Main {public static void main(String[] args) {System.out.println(new Solution().twoSum(new int[]{1,2,4,6}, 10));} }總結
以上是生活随笔為你收集整理的【算法】哈希表 ( 两数之和 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法】双指针算法 ( 有效回文串 II
- 下一篇: 【算法】快速排序