算法系列-第六题

147 阅读1分钟

题目名称:两数之和

给定一个整数数组  nums  和一个整数目标值  target,请你在该数组中找出  和为目标值 target  的那  两个  整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:


输入: nums = [2,7,11,15], target = 9

输出: [0,1]

解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例 2:


输入: nums = [3,2,4], target = 6

输出: [1,2]

示例 3:


输入: nums = [3,3], target = 6

输出: [0,1]


/**

* 解法一:双层循环

* 思路:详情看以下代码

* 时间复杂度:O(n^2),双层循环

* 空间复杂度:O(1)

* 注意:如果这里的 nums 是有序的话,优化嵌套循环,可以考虑 “双指针”

*/

function twoSum(nums, target) {

const res = [];

const len = nums.length;

if (len === 0) return res;

  


for (let i = 0; i < len - 1; i++) {

const n1 = nums[i];

let flag = false; // 是否得到结果

  


for (let j = i + 1; j < len; j++) {

const n2 = nums[j];

if (n1 + n2 === target) {

res.push(i);

res.push(j);

flag = true;

break;

}

}

  


if (flag) break;

}

  


return res;

}


/**

* 解法二:哈希

* 思路:遍历的同时借助哈希表,记录值和下标

* 时间复杂度:O(n),最多遍历数组一遍,每次查询哈希表都是O(1)

* 空间复杂度:O(n),最坏情况下找到数组结尾才找到,其他都加入哈希表,哈希表最长 n - 1

*/

function twoSum(nums, target) {

const res = [];

const len = nums.length;

if (len === 0) return res;

  


const map = new Map();

  


for (let i = 0; i < len; i++) {

const temp = target - nums[i];

if (!map.has(temp)) {

map.set(nums[i], i);

} else {

res.push(map.get(temp));

res.push(i);

return res;

}

}

  


return res;

}