这是我参与更文挑战的第23天,活动详情查看: 更文挑战
- 这里收集了两数之和的各种javascript解法
题目
给定一个整数数组 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]
复制代码
解法
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
暴力枚举
内外双循环、简单、好理解。
* 时间复杂度:O(N^2),其中N是数组的元素数量
* 空间复杂度:O(1)
*/
/**
92ms
*/
var twoSum = function (nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
return [i, j];
}
}
}
};
复制代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
* 时间复杂度:O(N),其中N是数组的元素数量
* 空间复杂度:O(N),其中N是数组的元素数量
*/
/**
80ms
*/
var twoSum2 = function(nums, target) {
//静态哈希表法
const map = new Map();
for(let i = 0;i < nums.length;i++){
map.set(nums[i],i);
}
for(let i = 0;i < nums.length;i++){
const diff = target - nums[i];
if(map.has(diff) && map.get(diff) !== i){
return [i,map.get(diff)];
}
}
};
复制代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
* 动态哈希表法
* 时间复杂度:O(N),其中N是数组的元素数量
* 空间复杂度:O(N),其中N是数组的元素数量
*/
/**
92ms
*/
var twoSum3 = function (nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const num1 = nums[i];
const num2 = target - nums[i];
if(map.has(num2)){
return [map.get(num2),i];
}else{
map.set(num1,i);
}
}
};
复制代码
/**
100 ms
* 类暴力查找
* 时间复杂度:O(N^2),其中N是数组的元素数量
* 空间复杂度:O(N),其中N是数组的元素数量
*/
var twoSum4 = function(nums, target) {
let temp = []
for (let i = 0; i < nums.length; i++) {
let dif = target-nums[i]
if (temp[dif] !== undefined) {
return [temp[dif], i]
}
temp[nums[i]] = i;
}
};
复制代码
/**
100 ms
* Map方法
* 新建一个字典
* nums里的值,逐个来循环,没有合适的就先收集着,有合适的就返回
* 时间复杂度:O(N),其中N是数组的元素数量
* 空间复杂度:O(N),其中N是数组的元素数量
*/
var twoSum6 = function(nums, target) {
const map=new Map();
const len=nums.length;
for(let i=0;i<len;i++)
{
const targetNum=target-nums[i];//获取差值
if(map.has(nums[i]))
{
return [map.get(nums[i]),i];//判断当前的值是否包含在map中,如果包含就返回
}
map.set(targetNum,i);//如果不包含就将差值放进map
}
console.log(map);
};
复制代码
解题思路
-
暴力枚举法
- 双层循环
-
哈希表
- 维护一个哈希表,key是数字,value为下标,遍历数组,判断(目标值-当前数)的值是否存在哈希表里,存在则返回对应的下标,不存在则把当前数字放入哈希表
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END