两数之和
1. 暴力枚举
时间复杂度:O(N^2),空间复杂度:O(1)
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]
}
}
}
};
2. 静态哈希表
时间复杂度:O(N),空间复杂度:O(N)
原理:在哈希表里逐个对x查询是否还存在target - x
- 将各个数字的
key-value存放在map数组里 - 逐个获取
target - x - 判断是否存在该哈希表
var twoSum = 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)];
}
}
};
3. 动态哈希表
时间复杂度:O(N),空间复杂度:O(N)
原理:在静态哈希表的基础上改进
var twoSum = function (nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const num1 = nums[i];
const num2 = target - num1;
if (map.has(num2)) {
return [i, map.get(num2)]
} else {
map.set(num1, i);
}
}
};