链接
001.两数之和
题目描述
方法一:暴力枚举
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
for(let i=0;i<nums.length-1;i++){
for(let j = i + 1; j<nums.length;j++)
if(nums[i]+nums[j]==target){
pos1=i;
pos2=j;
break;
}
}
let result = [pos1,pos2];
return result;
};
改进
- 根本不需要那两个多余的参数好吧
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
for(let i=0;i<nums.length-1;i++){
for(let j = i + 1; j<nums.length;j++)
if(nums[i]+nums[j]==target){
return [i,j]
}
}
return []
};
- 执行时间一下子就下降了近30%
复杂度分析: - 时间复杂度: O ( N 2 ) O(N^2) O(N2) ,其中 N 是数组中的元素数量。在最坏情况下数组中任意两个数都要被匹配一次。
- 空间复杂度: O ( 1 ) O(1) O(1)。
方法二:哈希表
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let len = nums.length;
//创建MAP
const MAP = new Map();
// 由于第一个元素在它之前一定没有元素与之匹配,所以先存入哈希表
MAP.set(nums[0],0);
for(let i=1;i<len;i++){
let other = target-nums[i];
// 遍历到当前元素的时候, 判断map中是否存在目标值
if(MAP.has(other))
return [MAP.get(other), i];
MAP.set(nums[i],i);
}
};
复杂度分析:
- 时间复杂度: O ( N ) O(N) O(N) ,其中 N 是数组中的元素数量。对于每个元素 x x x,用 O ( 1 ) O(1) O(1)的复杂度找 t a r g e t − x target-x target−x。
- 空间复杂度: O ( N ) O(N) O(N), N N N是数组中元素的数量,主要是哈希表的开销。