方法一:双循环
var arr = [1, 2, 5, 3, 10, 12, 8, 9, 2]; var sum = 18; function findSum(arr, sum) { // 我们用x去测试复杂度 var x = 0; // 两层遍历 时间复杂度O(n^2) n的平方 O表示一个量级 // 算法的复杂度是基于n的平方来计算的 for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr.length; j++) { if (i !== j && arr[i] + arr[j] == sum) { console.log(arr[i], arr[j]); } // x++; } } // console.log(x, '我是x'); //输出 81 -> 数组一共9项,9*9 =81 } findSum(arr, sum); /* 0 4 1 10 1 7 2 9 3 6 3 8 4 0 10 1 6 3 8 3 7 1 9 2 7 8 9 2 8 7 2 9 */ // 综上,如果数组是一个1万长度的数组,那么复杂度将是10000*10000 就会特别特别大,就会严重影响性能
方法2: 技巧型
var arr = [1, 2, 5, 3, 10, 12, 8, 9, 2]; var sum = 11; // 我们换一种思路: /* 我们应该以目标sum=11,去看数组中的每一项: 如:第一项为1,那么我们缺少一个10, 变成目标sum 11 第二项为2,缺少9 ->11 .... */ function findSum(arr, sum) { let obj = {}; arr.forEach((item, index) => { if (String(item) in obj) { console.log(obj[item], index); } obj[sum - item] = index; // {10:0 ,9:1 , 6:2 , 8:3 , 1:4, -1:5, 3:6 , 2:7, 9:8} }); } findSum(arr, sum);