日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【算法】哈希表 ( 两数之和 )

發布時間:2025/6/17 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】哈希表 ( 两数之和 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法 系列博客

【算法】刷題范圍建議 和 代碼規范
【算法】復雜度理論 ( 時間復雜度 )

【字符串】最長回文子串 ( 蠻力算法 )
【字符串】最長回文子串 ( 中心線枚舉算法 )
【字符串】最長回文子串 ( 動態規劃算法 ) ★
【字符串】字符串查找 ( 蠻力算法 )
【字符串】字符串查找 ( 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));} }

總結

以上是生活随笔為你收集整理的【算法】哈希表 ( 两数之和 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。