? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LeetCode??真題 1.兩數(shù)之和? ?? ??
描述:給定一個整數(shù)數(shù)組 nums?和一個目標值 target窃躲,請你在該數(shù)組中找出和為目標值的那?兩個?整數(shù)移层,并返回他們的數(shù)組下標漠酿。你可以假設每種輸入只會對應一個答案。但是吉嚣,你不能重復利用這個數(shù)組中同樣的元素梢薪。
例:給定 nums = [2, 7, 11, 15], target = 9因為 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]。
誠然此題如果純粹用雙重遍歷暴力解決尝哆,但是這樣做又怎么能對得起一個極客的職業(yè)素養(yǎng)呢秉撇。那么如何解決掉它?
這種尋找目標的問題如果要找到對應的目標秋泄,只是一昧的窮舉琐馆,那么運算將會無窮大,那么在已知目標值的前提下求取目標值所在數(shù)組的索引。顯而易見,用散列表是最佳選擇污呼。
可以先用哈希表Map綁定key,value鍵值對瞎暑,然后遍歷元素的時候,計算出目標值与帆,用目標值匹配哈希表,為空則不存在墨榄,否之則有目標值玄糟,并輸出對應的元素下標。
var tosum = function(nums,target){
var map = new Map();
var collect = [];
for(var i=0;i<nums.length;i++){
????var a = target - nums[i];? ? ? ? ? ? ? ? ? ? ? ?//獲取目標值袄秩,每個元素木不知不同
????if(map.has(a)&&map.get(a)!=i){? ? //若哈希表包含此元素的目標值阵翎,且目標值對應的索引不等于i(即找的對象不等于元素本身)
? ????? collect.push(map.get(a));? ? ?//獲取這兩個索引
????????collect.push(i);
????}
????map.set(nums[i],i);? ? ? ? ? ? ? ? ? ? //添加鍵值對
????return collect;
}