LeetCode每日一练【18】

Four Sum

我的解法

介绍

太好了! 虽然并不是每次, 但是在测试代码的时候, 居然出现了内存使用率超过了100.00%! 虽然并非每次都是, 但是这也证明了代码的可用性.

思路

  1. 可以参考三和法和二和法, 不过多赘述: https://www.cnblogs.com/mapodoufu/p/16215421.htmlhttps://www.cnblogs.com/mapodoufu/p/16216178.html

代码

/*
 * @Author: fox
 * @Date: 2022-05-02 18:43:16
 * @LastEditors: fox
 * @LastEditTime: 2022-05-02 22:16:43
 * @Description: https://leetcode.com/problems/4sum/
 */

/**
 * @description: Runtime: 91.50% Memory Usage: 100.00%
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
const fourSum = (nums, target) => {
    const res = []; // 返回结果
    const len= nums.length;

    nums.sort((a, b) => a - b) // 升序排序

    for (let i = 0; i < len - 3; i++) {
        if (i > 0 && !(nums[i] ^ nums[i - 1])) continue // 去重
        for (let j = i + 1; j < len - 2; j++) {
            if (j > i + 1 && !(nums[j] ^ nums[j - 1])) continue // 去重
            for (let left = j + 1, right = len - 1; left < right;) {
                const sum = nums[i] + nums[j] + nums[left] + nums[right]; // 求和

                if (sum < target) {
                    left++;
                    continue;
                }

                if (sum > target) {
                    right--;
                    continue;
                }

                res.push([nums[i], nums[j], nums[left], nums[right]])

                while (!(nums[left] ^ nums[left + 1]) && left < right) left++; // 去重处理
                while (!(nums[right] ^ nums[right - 1]) && left < right) right--; // 去重处理

                left++;
                right--;
            }
        }
    }
    
    return res
};

let nums;

nums = [1,0,-1,0,-2,2]
console.log(fourSum(nums, 0)) // [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

nums = [2, 2, 2, 2, 2]
console.log(fourSum(nums, 8)) // [[2,2,2,2]]

nums = [0, 0, 0, 0]
console.log(fourSum(nums, 0)) //[0,0,0,0]
posted @ 2022-05-02 22:25  白い故雪  阅读(21)  评论(0编辑  收藏  举报