問題描述
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。
實例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解決方法
解法一
暴力遍歷方法,通過雙層遍歷,窮盡組合找到兩個元素,使之和滿足目標值。
原理:雙層遍歷所有元素,找到 a + b = target 的元素的索引。
時間復雜度為 O(n^2),空間復雜度為 O(1)。
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
const a = nums[i];
for (let j = i + 1; i < nums.length; i++) {
const b = nums[i];
if (a + b === target) {
return [i, j];
}
}
}
return new Error('there is no answer');
};
解法二
為了快速的查找 target - nums[i]
元素所在的位置,我們可以使用哈希表快速查找元素。比起遍歷算法,執行的時間效率為 O(1)。具體實現如下:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const map = new Map();
nums.forEach((value, index) => {
map.set(value, index);
});
for (let i = 0; i < nums.length; i++) {
const a = nums[i];
const residual_value = target - a;
const j = map.get(residual_value);
if (j !== undefined && j !== i) {
return [i, j];
}
}
return new Error('there is no answer');
};
時間復雜度為 O(n),空間復雜度為 O(n)。
解法三
仍然是使用哈希表找元素,但是只使用一次哈希。
var twoSum = function(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (map.get(complement)) {
return [map.get(complement), i];
}
map.set(nums[i], i);
}
return new Error('there is no answer');
};