前端面试中常被问到求两个数之和等于给定的值
如:在数组[2, 3, 5, 7, 11, 15]中找到两个数,使之和等于20,并返回这两个数的坐标,如果没有找到返回空[]
缺点:这种方法有局限性,首先需要对数组排序,带来额外的消耗
优点:对有序数组友好
实现方式:无序数组进行排序(有序直接查找),然后使用二分查找的方式进行,定义头尾两个指针,并进行数值求和并和目标值进行比较,小于目标值则左指针++,大于目标值右指针--,等于目标值则返回,找不到则返回空,实现方式如下:
function toNumberSum(arr, sum) {
if (!arr.length) return [];
let tmp = arr.sort((a, b) => a - b);
let p = 0,
q = tmp.length - 1;
let res = [];
while (p < q) {
if (tmp[p] + tmp[q] === sum) {
res = [p, q];
return res;
} else if (tmp[p] + tmp[q] < sum) {
p++;
} else {
q--;
}
}
return res;
}
toNumberSum([2, 3, 5, 7, 11, 15], 27)
利用Map对象键值唯一性,使用目标值减去数组中的值作为键值,判断该键值是否存在,存在则找到,不存在继续循环数组,直到结束。
该方法适用于有序和无序数组
function twoNumberSum2(arr, sum) {
if (!arr.l