12-找到数组中的两项的和等于传入的指定数

方法一:双循环

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

 

posted @ 2021-06-20 00:10  猎奇游渔  阅读(56)  评论(0编辑  收藏  举报