js 数组中三个元素之和为零 输出不重复的可能

2020-04-26  本文已影响0人  牛奶大泡芙

这是一个比较经典的题目了,首先在函数的主体内用了dfs的方法,并通过“ i > indexs[x]”来限制重复结果的出现,这样仍然可能出现重复的结果比如这种情况:

[-1,-1,-1,2]

就是结果中的元素出现了冗余 重复多次,于是用了strings记录每个结果的“sort-->tostring”形式,这样可以避免重复结果的出现。
目前这个方案还存在优化空间,欢迎指正ou~

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var inner = function (x, y) {
    if (x < y) {
        return 1;
    } else if (x > y) {
        return -1;
    } else {
        return 0;
    }
}
var make = function(strings, newone) {
    var n = newone.concat();
    n.sort(inner);
    var s = n.join('');
    if (strings.length === 0 || strings.indexOf(s) === -1) {
        strings.push(s);
        return true;
    }
    return false;
}
var dfs = function(nums, state, chain, res, indexs, strings) {
    var n = nums.length;
    if (chain.length === 3) {
        if((chain[0] + chain[1] + chain[2] === 0)){
            if(make(strings, chain)) {
                var cp = chain.concat();
                res.push(cp);
            }   
        }
        return;
    }
    var x = indexs.length-1
    for (var i = 0; i<n; i++) {
        var p = nums[i];
        if(state[i] && i > indexs[x]) {
            chain.push(p);
            indexs.push(i);
            state[i] = false;
            dfs(nums, state, chain, res, indexs, strings);
            state[i] = true;
            chain.pop();
            indexs.pop()
        }
    }
}
var threeSum = function(nums) {
    var res = [];
    var state = [];
    var strings = [];
    for(var j = 0; j<nums.length; j++){
        state.push(true);
    }
    dfs(nums, state, [], res, [-1], strings);
    return res;
};

点个小心心再走吧❥(^_-)

上一篇 下一篇

猜你喜欢

热点阅读