問題描述:
給定一個整數(shù)數(shù)組和一個目標(biāo)值,找出數(shù)組中和為目標(biāo)值的兩個數(shù)碎捺。
你可以假設(shè)每個輸入只對應(yīng)一種答案,且同樣的元素不能被重復(fù)利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9因為 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]
Java算法一:
暴力遍歷--我的杰作
后來我知道凤薛。可以 return new int[] {i,j}诞仓;嗯缤苫,的確又優(yōu)化了我的代碼,好開心(??ˇ?ˇ?)墅拭。
但是活玲!但是啊谍婉!耗時長啊舒憾,關(guān)于時間復(fù)雜度可以看這里,反正就是耗時長穗熬,優(yōu)秀的我當(dāng)然不會妥協(xié)的呀镀迂。↓↓↓↓↓
Java算法二:
兩遍哈希表唤蔗?探遵??妓柜?--來自LeetCode别凤,學(xué)習(xí)學(xué)習(xí)。
哈希表什么鬼领虹?黑人問號规哪。
看這里看這里,學(xué)習(xí)到了塌衰。-->>哈希表
引用自LeetCode
為了對運行時間復(fù)雜度進行優(yōu)化诉稍,我們需要一種更有效的方法來檢查數(shù)組中是否存在目標(biāo)元素。如果存在最疆,我們需要找出它的索引杯巨。保持數(shù)組中的每個元素與其索引相互對應(yīng)的最好方法是什么?哈希表努酸。
通過以空間換取速度的方式服爷,我們可以將查找時間從O(n)O(n)O(n)降低到O(1)O(1)O(1)。哈希表正是為此目的而構(gòu)建的,它支持以近似恒定的時間進行快速查找仍源。我用“近似”來描述心褐,是因為一旦出現(xiàn)沖突,查找用時可能會退化到O(n)O(n)O(n)笼踩。但只要你仔細地挑選哈希函數(shù)逗爹,在哈希表中進行查找的用時應(yīng)當(dāng)被攤銷為O(1)O(1)O(1)。
一個簡單的實現(xiàn)使用了兩次迭代嚎于。在第一次迭代中掘而,我們將每個元素的值和它的索引添加到表中。然后于购,在第二次迭代中袍睡,我們將檢查每個元素所對應(yīng)的目標(biāo)元素(target?nums[i]target - nums[i]target?nums[i])是否存在于表中。注意肋僧,該目標(biāo)元素不能是nums[i]nums[i]nums[i]本身斑胜!
來自LeetCode
public int[] twoSum(int[] nums, int target)
{
??? Map map = new HashMap<>();
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? map.put(nums[i], i);//構(gòu)成key,value對應(yīng)的關(guān)系,數(shù)值為key,索引為value
? ? }
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? int complement = target - nums[i]色瘩;//求補
? ? ? ? if (map.containsKey(complement) && (int)map.get(complement) != i) {
//尋找除了自身以外的元素
? ? ? ? ? ? return new int[] { i, (int)map.get(complement) };//符合補數(shù)的下標(biāo)
? ? ? ? }
? ? }
? ? throw new IllegalArgumentException("No two sum solution");//異常處理
}
嗯,還是這個方法好逸寓,代碼少居兆,速度快
算法三:
一遍哈希表:--LeetCode
事實證明,我們可以一次完成竹伸。在進行迭代并將元素插入到表中的同時泥栖,我們還會回過頭來檢查表中是否已經(jīng)存在當(dāng)前元素所對應(yīng)的目標(biāo)元素。如果它存在勋篓,那我們已經(jīng)找到了對應(yīng)解吧享,并立即將其返回。
public int[] twoSum(int[] nums, int target) {
??? Map map = new HashMap<>();
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? int complement = target - nums[i];
? ? ? ? if (map.containsKey(complement)) {
? ? ? ? ? ? return new int[] { map.get(complement), i };
? ? ? ? }
? ? ? ? map.put(nums[i], i);//放的同時找---回首望月譬嚣,嘿钢颂,皮。
? ? }
? ? throw new IllegalArgumentException("No two sum solution");
}
總結(jié)就是對現(xiàn)有函數(shù)的熟練使用以及結(jié)題思路要找對拜银,哎殊鞭,可惜我的是加法,年輕啊騷年
加油加油--你是要稱為大神的男人尼桶!
774--WELOVE