Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过4sum中的测试用例_Javascript_Algorithm - Fatal编程技术网

Javascript 如何通过4sum中的测试用例

Javascript 如何通过4sum中的测试用例,javascript,algorithm,Javascript,Algorithm,这里是我的代码来解决leetcode中的问题 var fourSum = function(ns, tar) { ns.sort((a, b) => a-b); let res=[], out=false; for(let i=0; i<ns.length-3; i++) { if(ns[i] !== ns[i-1]) { out = threeSum(ns, i+1, tar-ns[i]);

这里是我的代码来解决leetcode中的问题

var fourSum = function(ns, tar) {
    ns.sort((a, b) => a-b);

    let res=[], out=false;
    for(let i=0; i<ns.length-3; i++) {
        if(ns[i] !== ns[i-1]) {
            out = threeSum(ns, i+1, tar-ns[i]);

            for(let item of out) {
                res.push([ns[i], ...item]);
            }
        }
    }

    return res;
};

var threeSum = function(ns, ind, tar) {
    let res=[], out=false;
    for(let i=ind; i<ns.length-2; i++) {
        if(ns[i] !== ns[i-1]) {
            out = twoSum(ns, i+1, tar-ns[i]);

            for(let item of out) {
                res.push([ns[i], ...item]);
            }
        }
    }

    return res;
}

var twoSum = function(ns, ind, tar) {    
    let set = new Set();
    let res = [];
    for(let i=ind; i<ns.length; i++) {
        if(set.has(tar-ns[i])) {
            res.push([tar-ns[i], ns[i]]);
            while(ns[i] === ns[i+1]) i++;
        } else {
            set.add(ns[i]);
        }    
    }

    return res;
}
如果我删除IFN[I]!==ns[i-1]{它能够通过案例1,但在

case 2:
[-3,-2,-1,0,0,1,2,3]
0
为什么不直接使用4个for循环来解决这个问题呢?基本上,a、b、c和d各取4个循环。如果它们的总和达到目标值,则只需按递增顺序将它们添加到名为res的结果数组中

最后,您只需确保res只有唯一的值。为此,您可以查看将数组转换为字符串的方法,然后检查重复项并删除重复项

以下是我公认的解决方案:

var fourSum = function(nums, target) {

    var res = [];
    for(var a=0; a < nums.length; a++){
        for(var b=a+1; b < nums.length; b++){
            for(var c=b+1; c < nums.length; c++){
                for(var d=c+1; d < nums.length; d++){
                    if(nums[a] + nums[b] + nums[c] + nums[d] == target){
                        res.push( [nums[a], nums[b], nums[c], nums[d]].sort() )
                    }
                }
            }
        }
    }

    var res_set  = new Set(res.map(JSON.stringify));
    var res_uniq = Array.from(res_set).map(JSON.parse);

    return res_uniq;
};

我再次检查了测试用例:[0,0,0,0],sum==0

如果i==0,当登陆到这个ifns[i]!==ns[i-1]{

它变成ifns[0]!==ns[0-1]{

out=threeSumns,i+1,tar ns[i];能够执行

基本上,这意味着每个?总和中的第一个数字需要忽略

因此,我在3sum func中做了以下更改

ifi-1>=ind&&ns[i]==ns[i-1]继续

完整代码:

var fourSum = function(ns, tar) {
    ns.sort((a, b) => a-b);

    let res=[], out=false;
    for(let i=0; i<ns.length-3; i++) {
        // can get in
        if(ns[i] !== ns[i-1]) {            
            out = threeSum(ns, i+1, tar-ns[i]);

            // each set add ns[i], 4 # now
            for(let item of out) {
                res.push([ns[i], ...item]);
            }
        }
    }

    return res;
};

var threeSum = function(ns, ind, tar) {
    let res=[], out=false;
    for(let i=ind; i<ns.length-2; i++) {
        if(i-1 >= ind && ns[i] === ns[i-1]) continue;

        out = twoSum(ns, i+1, tar-ns[i]);

        for(let item of out) {
            res.push([ns[i], ...item]);
        }
    }

    return res;
}

var twoSum = function(ns, ind, tar) {    
    let set = new Set();
    let res = [];
    for(let i=ind; i<ns.length; i++) {
        if(set.has(tar-ns[i])) {
            res.push([tar-ns[i], ns[i]]);
            while(ns[i] === ns[i+1]) i++;
        } else {
            set.add(ns[i]);
        }    
    }

    return res;
}

查看这个可爱的博客寻求帮助。在遍历多层解决方案时尝试跟踪逻辑。我相信如果您记录您的方法,使用有意义的变量名等,您将更容易获得帮助。@analogman可以随意添加您的有效解决方案作为答案。我个人认为这是一个易于理解的解决方案。干得好
var fourSum = function(ns, tar) {
    ns.sort((a, b) => a-b);

    let res=[], out=false;
    for(let i=0; i<ns.length-3; i++) {
        // can get in
        if(ns[i] !== ns[i-1]) {            
            out = threeSum(ns, i+1, tar-ns[i]);

            // each set add ns[i], 4 # now
            for(let item of out) {
                res.push([ns[i], ...item]);
            }
        }
    }

    return res;
};

var threeSum = function(ns, ind, tar) {
    let res=[], out=false;
    for(let i=ind; i<ns.length-2; i++) {
        if(i-1 >= ind && ns[i] === ns[i-1]) continue;

        out = twoSum(ns, i+1, tar-ns[i]);

        for(let item of out) {
            res.push([ns[i], ...item]);
        }
    }

    return res;
}

var twoSum = function(ns, ind, tar) {    
    let set = new Set();
    let res = [];
    for(let i=ind; i<ns.length; i++) {
        if(set.has(tar-ns[i])) {
            res.push([tar-ns[i], ns[i]]);
            while(ns[i] === ns[i+1]) i++;
        } else {
            set.add(ns[i]);
        }    
    }

    return res;
}