日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/6/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】哈希表 ( 两数之和 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法 系列博客

【算法】刷題范圍建議 和 代碼規(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。