zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    STDMETHOD (转)
    DirectX中的纹理映射相关技术 (转)
    (转)清空std::stringstream,联系到stream的clear()和清空
    (转载)MultiAnimation
    (转)SkyBox
    [转载]漫谈游戏中的阴影技术
    反射矩阵计算
    (转)COM组件里的AddRef()
    LINQ简记(2):重要概念
    继续聊WPF——自定义命令
  • 原文地址:https://www.cnblogs.com/haoqiyouyu/p/14905606.html
Copyright © 2011-2022 走看看