三数之和精选代码

111 阅读1分钟
var threeSum = function(nums) {
    const resArr = [];
    const length = nums.length
    // 先进行排序
    nums = nums.sort((a, b) => a - b);
    // nums长度大于2,才能进行3数之和的判断。
    for (let i = 0; i < length - 2; i ++) {
        // 因为是升序排列后,nums[i]<0才有可能三数之和为0;
        // 当nums[i]与nums[i - 1]相等,说明已经对比过包含这个数的三数之和。就跳过
        if (nums[i] < 0 && i > 0 && nums[i] !== nums[i - 1]) {
            let left = i + 1;
            let right = length - 1;
            const target = -nums[i]; 
            while (left < right) {
                if (nums[left] + nums[right] === target) {
                    resArr.push([nums[i], nums[left], nums[right]]);
                    // 对left和left+1相等的元素去重
                    while (left < right &&  nums[left] === nums[left + 1]) left ++;
                    // 对right和right-1相等的元素去重
                    while (left < right && nums[right] === nums[right - 1]) right --;
                    left ++;
                    right --;
                } else if (nums[left] + nums[right] < target) {
                    left ++
                } else {
                    right --;
                }
            }
        }
    }
    return resArr;
}