Leecode(三数求和)

69 阅读1分钟

思路

思路1:求和问题转为求差问题-固定一个数,在剩下的数中寻找是否有两个数与之相加和为0
思路2:双指针实现空间换时间,且保证该数组必须有序

答案

const threeNumberSum = (list) => {
    const result = [];
    list.sort((a, b) => a - b)
    for(let i = 0; i< list.length-2; i++) {
      let left = i + 1;
      let right = list.length - 1;
      if(i> 0 && list[i] === list[i-1]) {
        continue;
      }
      while(left < right) {
        if(list[i] + list[left] + list[right] < 0) {
          left++
          while(left < right && list[left-1] === list[left]) {
            left++
          }
        } else if (list[i] + list[left] + list[right] > 0) {
          right--
          while(left < right && list[right] === list[right + 1]) {
            right--
          }
        } else {
          result.push([list[i], list[left], list[right]])
          left++
          right--
          while(left < right && list[left-1] === list[left]) {
            left++
          }
          while(left < right && list[right] === list[right + 1]) {
            right--
          }
        }
      }
    }
    return result;
  }