两数求和算法
2021-03-10 本文已影响0人
Lia代码猪崽
题目
假设有一个整数数组 nums
,写一个方法 twoSum()
,返回数组中两个元素之和等于入参的下标数组。
假设:
-
nums
为[1, 2, 3, 4]
-
sum
为6
- 应返回
[1, 3]
算法优化解析
- 所有
求和
的问题都可以转换为求差
- 像这题目普遍做法是双层循环嵌套,但这时间复杂度就是
O(n^2)
,应该考虑用空间换时间,只遍历一次,遍历的同时,通过映射关系
把之前遍历过的数据存下来,把复杂度转化为O(n)
。
所以本题目:
- 可通过备忘录模式来达到只循环一次。缓存的数据的映射关系应该为
{ key(元素值): value(元素下标) }
。 - 又因为
总和 - 当前值 = 目标值
,查找缓存的数据
中有无目标值
,若有则把当前值
和目标值
的下标
返回,若无就缓存当前值
。
解法一:js 对象
const nums = [1, 2, 3, 4]
const target = 6
function twoSum() {
let numberMap = {}
for (let i = 0; i < nums.length; i++) {
if (numberMap[target - nums[i]]) {
return [numberMap[target - nums[i]], i]
}
numberMap[nums[i]] = i
}
}
twoSum() // [1, 3]
解法二:Map 对象
const nums = [1, 2, 3, 4]
const target = 6
function twoSum() {
let numberMap = new Map()
for (let i = 0; i < nums.length; i++) {
if (numberMap.has(target - nums[i])) {
return [numberMap.get(target - nums[i]), i]
}
numberMap.set(nums[i], i)
}
}
twoSum() // [1, 3]