/*
 * [15] 三数之和
 */

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
  nums.sort((a, b) => a - b);
  const len = nums.length;
  const ans = []
  for (let i = 0; i < len; i++) {
    const aVal = nums[i];

    // 如果第一个数都大于 0 了,说明后面的都大于 0 了,没必要计算了
    if (aVal > 0) return ans;

    // 去重
    if (aVal === nums[i - 1]) continue;

    let l = i + 1, r = len - 1;
    while (l < r) {
      const lVal = nums[l], rVal = nums[r];
      const sum = aVal + lVal + rVal;

      if (l - 1 > i + 1 && lVal === nums[l - 1]) {
        l++;
        continue;
      }
      if (rVal === nums[r + 1]) {
        r--;
        continue;
      }

      if (sum === 0) {
        ans.push([aVal, lVal, rVal]);

        // while (l < r && nums[l] === nums[l + 1]) {
        //   l++;
        // }
        // while (l < r && nums[r] === nums[r - 1]) {
        //   r--
        // }

        l++;
        r--;
      } else if (sum > 0) {
        r--
      } else {
        l++
      }
    }
  }
  return ans;
};

console.log(threeSum([-1, 0, 1, 2, -1, -4]))