两数之和
1. 暴力枚举
时间复杂度:O(N^2),空间复杂度:O(1)
js 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
- 判断是否存在该哈希表 js 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)
原理:在静态哈希表的基础上改进 js 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); } } };