【力扣】 - 1.两数之和

136 阅读1分钟

两数之和

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);
        }
    }
};