問(wèn)題描述:
給定一個(gè)整數(shù)數(shù)組和一個(gè)目標(biāo)值,找出數(shù)組中和為目標(biāo)值的兩個(gè)數(shù)。
你可以假設(shè)每個(gè)輸入只對(duì)應(yīng)一種答案,且同樣的元素不能被重復(fù)利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9因?yàn)?nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]
Java算法一:
暴力遍歷--我的杰作
后來(lái)我知道。可以 return new int[] {i,j};嗯,的確又優(yōu)化了我的代碼,好開(kāi)心(??ˇ?ˇ?)。
但是!但是??!耗時(shí)長(zhǎng)啊,關(guān)于時(shí)間復(fù)雜度可以看這里,反正就是耗時(shí)長(zhǎng),優(yōu)秀的我當(dāng)然不會(huì)妥協(xié)的呀?!?/p>
Java算法二:
兩遍哈希表????--來(lái)自L(fǎng)eetCode,學(xué)習(xí)學(xué)習(xí)。
哈希表什么鬼?黑人問(wèn)號(hào)。
看這里看這里,學(xué)習(xí)到了。-->>哈希表
引用自L(fǎng)eetCode
為了對(duì)運(yùn)行時(shí)間復(fù)雜度進(jìn)行優(yōu)化,我們需要一種更有效的方法來(lái)檢查數(shù)組中是否存在目標(biāo)元素。如果存在,我們需要找出它的索引。保持?jǐn)?shù)組中的每個(gè)元素與其索引相互對(duì)應(yīng)的最好方法是什么?哈希表。
通過(guò)以空間換取速度的方式,我們可以將查找時(shí)間從O(n)O(n)O(n)降低到O(1)O(1)O(1)。哈希表正是為此目的而構(gòu)建的,它支持以近似恒定的時(shí)間進(jìn)行快速查找。我用“近似”來(lái)描述,是因?yàn)橐坏┏霈F(xiàn)沖突,查找用時(shí)可能會(huì)退化到O(n)O(n)O(n)。但只要你仔細(xì)地挑選哈希函數(shù),在哈希表中進(jìn)行查找的用時(shí)應(yīng)當(dāng)被攤銷(xiāo)為O(1)O(1)O(1)。
一個(gè)簡(jiǎn)單的實(shí)現(xiàn)使用了兩次迭代。在第一次迭代中,我們將每個(gè)元素的值和它的索引添加到表中。然后,在第二次迭代中,我們將檢查每個(gè)元素所對(duì)應(yīng)的目標(biāo)元素(target?nums[i]target - nums[i]target?nums[i])是否存在于表中。注意,該目標(biāo)元素不能是nums[i]nums[i]nums[i]本身!
來(lái)自L(fǎng)eetCode
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對(duì)應(yīng)的關(guān)系,數(shù)值為key,索引為value
? ? }
? ? for (int i = 0; i < nums.length; i++) {
? ? ? ? int complement = target - nums[i];//求補(bǔ)
? ? ? ? if (map.containsKey(complement) && (int)map.get(complement) != i) {
//尋找除了自身以外的元素
? ? ? ? ? ? return new int[] { i, (int)map.get(complement) };//符合補(bǔ)數(shù)的下標(biāo)
? ? ? ? }
? ? }
? ? throw new IllegalArgumentException("No two sum solution");//異常處理
}
嗯,還是這個(gè)方法好,代碼少,速度快
算法三:
一遍哈希表:--LeetCode
事實(shí)證明,我們可以一次完成。在進(jìn)行迭代并將元素插入到表中的同時(shí),我們還會(huì)回過(guò)頭來(lái)檢查表中是否已經(jīng)存在當(dāng)前元素所對(duì)應(yīng)的目標(biāo)元素。如果它存在,那我們已經(jīng)找到了對(duì)應(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);//放的同時(shí)找---回首望月,嘿,皮。
? ? }
? ? throw new IllegalArgumentException("No two sum solution");
}
總結(jié)就是對(duì)現(xiàn)有函數(shù)的熟練使用以及結(jié)題思路要找對(duì),哎,可惜我的是加法,年輕啊騷年
加油加油--你是要稱(chēng)為大神的男人!
774--WELOVE