Leetcode 4sums 简明解决方案

时间:2021-06-18 14:05:37

标签: javascript arrays algorithm

最近在做leetcode但是遇到这个4和question的困难。对于下面的kSum函数,我在网上看到了一些解决方案,传入一个空数组作为参数来存储结果。我认为它使 kSum() 参数过多。

我正在考虑重构 kSum() 拥有自身的参数但过程并不多。它返回一些奇怪的东西(例如一个空数组)

我想问一下我缺少什么才能使我的算法正常工作?我认为问题可能是由于第二个 for 循环通过 kSum(nums, i+1, ...) 循环?

const fourSum = (nums, target) => {
    const sortedNumsArray = nums.sort((a, b) => a - b)

    return kSum(sortedNumsArray, 0, 4, target)
}

const kSum = (nums, start, k, target) => {
    const result = [];

    if( nums.length === start  || nums[nums.length - 1] * k < target || nums[start] * k > target) return result;

    if (k === 2) {
        return twoSum(nums, 0, target)
    } else {
        let shouldCheck = false;

        for (let i = start; i < nums.length; i++) {
            if (shouldCheck && nums[i] !== nums[i - 1]) {
                for (let set of kSum(nums, i + 1, k - 1, target - nums[i])) {
                    result.push([nums[i]])
                    result[result.length - 1].concat(set)
                }
            }

            shouldCheck = true;
        }
    }

    return result;
}

const twoSum = (nums, start, target) => {
    let left = start;
    let right = nums.length - 1
    let subResult = []

    while (left < right) {
        let sum = nums[left] + nums[right]

        if (sum === target) {
           subResult.push([nums[left++], nums[right--]])

            while (left < right && nums[left] === nums[left + 1]) { left++ }
            while (left < right && nums[right] === nums[right - 1]) { right-- }
        } else if (sum > target) {
            right--
        } else {
            left++
        }
    }

    return subResult;
}

0 个答案:

没有答案