題目連接: leetcode-cn.com/problems/tw…git
看到題目後最早想到的就是兩個循環嵌套,遍歷每一個元素 x
,並查找是否存在一個值與 target - x
相等的目標元素。github
/** * @param {number[]} nums * @param {number} target * @return {number[]} */
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (target - nums[i] === nums[j]) {
return [i, j];
}
}
}
console.log("No two sum solution");
};
複製代碼
爲了對運行時間複雜度進行優化,咱們能夠使用哈希表。一個簡單的實現使用了兩次迭代。在第一次迭代中,咱們將每一個元素的值和它的索引添加到表中。而後,在第二次迭代中,咱們將檢查每一個元素所對應的目標元素 target - nums[i]
是否存在於表中。注意,該目標元素不能是 nums[i]
自己!算法
/** * @param {number[]} nums * @param {number} target * @return {number[]} */
var twoSum = function(nums, target) {
// 構造哈希表
var map = new Map();
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i);
}
for (let j = 0; j < nums.length; j++) {
let complement = target - nums[j];
if (map.has(complement) && map.get(complement) !== j) {
return [j, map.get(complement)];
}
}
console.log("No two sum solution");
};
複製代碼
其實咱們能夠經過一遍哈希表完成查找,在進行迭代並將元素插入到表中的同時,咱們還會回過頭來檢查表中是否已經存在當前元素所對應的目標元素。若是它存在,那咱們已經找到了對應解,並當即將其返回。微信
/** * @param {number[]} nums * @param {number} target * @return {number[]} */
var twoSum = function(nums, target) {
// 構造哈希表
var map = new Map();
for (let i = 0; i < nums.length; i++) {
let complement = target - nums[i];
if (map.has(complement)) {
return [map.get(complement), i];
}
map.set(nums[i], i);
}
console.log("No two sum solution");
};
複製代碼
請關注:github.com/leviding/le…優化
加微信 imleviding
並填寫驗證信息 算法
,加入 JavaScript 算法羣,每天打卡 LeetCode。ui
本人水平有限,歡迎交流分享你的想法,歡迎大佬批評指正。spa