LeetCode每日一练【18】
Four Sum
我的解法
介绍
太好了! 虽然并不是每次, 但是在测试代码的时候, 居然出现了内存使用率超过了100.00%! 虽然并非每次都是, 但是这也证明了代码的可用性.
思路
- 可以参考三和法和二和法, 不过多赘述: https://www.cnblogs.com/mapodoufu/p/16215421.html和https://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]
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号