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]