SOURCE

console.log = console.info
function isOk(a, b, target) {
    return a + b === target
}

function twoSum(nums, target) {
    if (nums.length < 2) return null

    const result = []
    let curIndex = 0
    while (curIndex < nums.length - 1) {
        for (let i = curIndex + 1; i < nums.length; i++) {
            isOk(nums[curIndex], nums[i], target) && result.push([nums[curIndex], nums[i]])
        }
        curIndex++
    }
    return !result.length ? null : result
}

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

function threeSum(nums, target) {
    if (nums.length < 3) return null

    const result = []
    let curIndex = 0
    while (curIndex < nums.length - 2) {
        const temp = twoSum(nums.slice(curIndex + 1), target - nums[curIndex])
        if (temp) {
            temp.forEach(item => {
                item.unshift(nums[curIndex])
                result.push(item)
            })
        }
        curIndex++
    }
    return !result.length ? null : result
}

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

function fourSum(nums, target) {
    if (nums.length < 4) return null

    const result = []
    let curIndex = 0
    while (curIndex < nums.length - 3) {
        const temp = threeSum(nums.slice(curIndex + 1), target - nums[curIndex])
        if (temp) {
            temp.forEach(item => {
                item.unshift(nums[curIndex])
                result.push(item)
            })
        }
        curIndex++
    }
    return !result.length ? null : result
}


function nSum(nums, target, n) {
    if (nums.length < n) return null

    const result = []
    let curIndex = 0

    if (n === 2) {
        // return twoSum(nums, target)
        // copy twoSum
        while (curIndex < nums.length - 1) {
            for (let i = curIndex + 1; i < nums.length; i++) {
                isOk(nums[curIndex], nums[i], target) && result.push([nums[curIndex], nums[i]])
            }
            curIndex++
        }
        return !result.length ? null : result
    }

    while (curIndex < nums.length - (n - 1)) { // -1,是因为自己占了一个数
        const temp = nSum(nums.slice(curIndex + 1), target - nums[curIndex], n - 1)
        if (temp) {
            temp.forEach(item => {
                item.unshift(nums[curIndex])
                result.push(item)
            })
        }
        curIndex++
    }
    return !result.length ? null : result
}

console.log(fourSum([1, 0, -1, 0, -2, 2], 0))
console.log(nSum([1, 0, -1, 0, -2, 2], 0, 4))
console 命令行工具 X clear

                    
>
console