js三数之和为0,记入数组

题目描述:

给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,*使得 *a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

function threeZero(arr) {
            // 去重并排序
            var ar = [...new Set(arr)].sort(function (a, b) { return a - b; });
            var i = 0;
            // 定义放入的数组
            var sum = [];
            // 遍历
            while (i < ar.length - 1) {
                // 从i后一个值开始,和最后一个值相加
                var a = ar[i], j = i + 1, k = ar.length - 1;
                while (j < k) {
                    var b = ar[j], c = ar[k];
                    // 三个if语句,判断完一个下面的继续判断
                    // 如果等于0,记录
                    if (a + b + c == 0) {
                        sum.push([a, b, c]);
                    }
                    // 即第三个if的情况,j变大k变小来判断
                    if (a + b + c <= 0) {
                        // 不满足其中一种情况就跳出,如果没有前面的条件,则j一直<k,一直加一,但实际上只需要加一次1
                        while (ar[j] == b && j < k) j++;
                    }
                    // 可能会出现[-5,-1,6]和[-5,0,5]的情况,因此记录完一组等于0的数据后还要再往后,让k-1,往前看
                    if (a + b + c >= 0) {
                        while (ar[k] == c && j < k) k--;
                    }
                }
                while (ar[i] == a && i < ar.length - 1) i++;
            }
            return sum;
        };
        var a = [-9, -5, -2, -1, 0, 1, 3, 5, 6];
        console.log(threeZero(a));

总结:

(1)自己写得太复杂,还是老老实实看别人写的

(2)注意向中间缩进比较的时候,while中应有两个判断条件,使得j和k分别只能变化一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值