給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。
鏈接:https://leetcode-cn.com/problems/two-sum
方法一
利用雙for循環,復雜度O(n2),耗時148ms
image.png
var twoSum = function(nums, target) {
let length = nums.length
for (let index = 0; index < length; ++index){
for (let index2 = index+1; index2 < length; ++index2){
if(nums[index] + nums[index2]===target){
return [index, index2]
}
}
}
}
方法二
利用hashMap方法,這個算法圖解一目了然,復雜度O(n), 耗時80ms
image.png
- 這道題本身如果通過暴力遍歷的話也是很容易解決的,時間復雜度在 O(n2)
- 由于哈希查找的時間復雜度為 O(1),所以可以利用哈希容器 map 降低時間復雜度
- 遍歷數組 nums,i 為當前下標,每個值都判斷map中是否存在 target-nums[i] 的 key 值
- 如果存在則找到了兩個值,如果不存在則將當前的 (nums[i],i) 存入 map 中,繼續遍歷直到找到為止
- 如果最終都沒有結果則拋出異常
- 時間復雜度:O(n)
var twoSum = function(nums, target) {
let mapObj = new Map()
let length = nums.length
for (let index = 0; index < length; ++index){
let t = target - nums[index]
let temp = mapObj.get(t)
if(temp >= 0) {
return [temp, index]
}
mapObj.set(nums[index], index)
}
}