两数之和
1、暴力法 -- 双层for循环
枚举数组中的每一个数 x,寻找数组中是否存在 target - x
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
n = nums.length;
// 遍历数组,判断target-nums[i]是否存在
for(let i=0;i<n;i++){
for(let j=i+1;j<n;j++){
if (nums[i] + nums[j] === target){
return [i,j];
}
}
}
};
二、哈希表
上面的算法主要耗时在于去查找target - x上面,时间复杂度为O(n)。所以改进的地方在于快速查找元素是否存在,并且在哪? 所以利用哈希表去查找元素,可以将查找元素的时间复杂度降低到O(1). 关于哈希表见 利用哈希表解此题的思想: 将每个元素都对应一个序号,构成key-value的形式,存在字典中。关键字key的值是元素,经过哈希表映射之后得到的位置是value的值。 当需要查找元素的时候,直接利用dict[key] = value 的形式就可以找到。
var twoSum = function(nums, target) {
// 设置一个哈希表,用来存储数据,并且快速查看是否有目标值存在
let m = new Map()
for(let i=0; i<nums.length; i++){
// 检查哈希表中是否存在对应的值
let targetNum = target - nums[i]
if(m.has(targetNum)){
// 去这个值的下标
let j = m.get(targetNum)
return [i,j]
}else{
m.set(nums[i],i)
}
}
};