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

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

/**
 * 先排序,然后循环取一个数组元素,与分别指向首尾的双指针元素相加
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    var sort = (arr) => {
        for(var i = 0; i < arr.length - 1; i++){
            for(var j = i + 1; j < arr.length; j++){
                if(arr[i] > arr[j]){
                    var temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }
    if(!nums.length || nums.length < 3) {
        return [];
    }
    var result = [],
        len = nums.length,
        sortArr = sort(nums);
    if(sortArr[0] > 0 || sortArr[len-1] < 0){
        return [];
    }
    for(var i = 0; i < len; i++){
        if(sortArr[i] > 0){
            break;	//首位>0
        }
        if(sortArr[i] == sortArr[i-1]){
            continue;	//去重
        }
        var left = i + 1,
            right = len -1;
        while(left < right){
            var sum = sortArr[i] + sortArr[left] + sortArr[right];
            if(sum == 0){
                result.push([sortArr[i], sortArr[left], sortArr[right]]);
                while(left < right && nums[left] == nums[left+1]){
                    left++;	//去重
                }
                while(left < right && nums[right] == nums[right-1]){
                    right--//去重
                }
                left++;
                right--;
            }else if(sum < 0){
                left++;
            }else{
                right--;
            }
        }
    }
    return result;
};