跳至主要內容

三数之和

Mr.He大约 1 分钟算法求和

三数之和

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

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

示例:

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

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

排序,三指针

function threeSum(nums) {
    const result = []
    // 必须传入对比函数
    const newNums = [...nums].sort((val1, val2) => val1 - val2)
    // newNums[i] < 0 保证所有的有正值,也有负值 i < newNums.length && newNums[i] < 0

    for (let i = 0; i < newNums.length - 2; i++) {
        // 从第一个开始取第一个数
        let left = i
        let mind = i + 1
        let right = newNums.length - 1
        // 如果有重复数字就跳过
        if (left > 0 && newNums[left] === newNums[left - 1]) {
            continue
        }
        // 移动中间的指针和右边指针来控制大小
        while (mind < right) {
            if (newNums[left] + newNums[mind] + newNums[right] > 0) {
                right--
                // 处理重复
                while (mind < right && newNums[right] === newNums[right + 1]) {
                    right--
                }
            }else if (newNums[left] + newNums[mind] + newNums[right] < 0) {
                mind++
                while (mind < right && newNums[mind] === newNums[mind - 1]) {
                    mind++
                }
            }else{
                result.push([newNums[left], newNums[mind], newNums[right]])
                right--
                mind++
                while (mind < right && newNums[right] === newNums[right + 1]) {
                    right--
                }
                while (mind < right && newNums[mind] === newNums[mind - 1]) {
                    mind++
                }
            }
        }
    }
    return result
}