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