LeetCode每日一练【16】
Three Sum Closest
我的解法
第一次提交
介绍
如果没有在做之前的那道题目的话, 按照我的解法虽然可以正确通过, 并且内存损耗极低. 但是却有一个致命的缺点, 那就是耗时太长, 甚至需要几千毫秒才可以分析出正确结果, 这在实际运用中, 显然是不可取的. 可以参考https://www.cnblogs.com/mapodoufu/p/16215421.html
but, 幸运的是, 这道题是前面那道题目的改版, 因此凭借之前参照https://www.cnblogs.com/mapodoufu/p/16215421.html
中的大神思路, 这里同样可以使用这种方法, 并且效果优秀.
思路
二和法解析
-
数组排序(升序):
arr.sort((a, b) => a - b)
-
二和法 -- 三指针:
arr[i] + arr[j] + arr[k] === target ?
;i
表示一个数组元素,j = i + 1
和k = arr.length - 1
, 然后通过移动j
和k
指针, 依次取得sum
值, 通过sum
值和target
值的关系, 无限让sum === target
arr[i] + arr[j] + arr[k] > target
, 移动k指针arr[i] + arr[j] + arr[k] < target
, 移动j指针arr[i] + arr[j] + arr[k] === target
, 直接返回结果
-
数组去重
arr[i]
的去重:(i > 0 && nums[i] === nums[i - 1])?
;true
跳过,false
执行arr[j]
和arr[k]
的去重:
while (nums[j] = nums[j + 1]) j++; // 去重处理 while (nums[k] = nums[k - 1]) k--; // 去重处理
代码
/*
* @Author: fox
* @Date: 2022-05-02 11:35:34
* @LastEditors: fox
* @LastEditTime: 2022-05-02 16:36:14
* @Description: https://leetcode.com/problems/3sum-closest/
*/
/**
* @description: Runtime: 89.88% Memory Usage: 76.62%
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
const threeSumClosest = (nums, target) => {
let res; // 存放返回结果
let minDiff; // 最小差值
nums.sort((a, b) => a - b) // 数组排序
for (let i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) continue // 去重处理
for (let j = i + 1, k = nums.length - 1; j < k;) {
const sum = nums[i] + nums[j] + nums[k]; // 求和
// 这是我新学的方法,用来比较两个数值是否相等很有效哦!
if (!(sum ^ target)) { // 如果相等,证明...就不用证明了吧?直接返回吧!
return sum
}
const diff = Math.abs(target - sum)
if (diff < minDiff || !minDiff) {
minDiff = diff
res = sum;
}
// 下面两个if语句用来无限让 sum 逼近 target
if (sum < target) {
j++;
continue;
}
if (sum > target) {
k--;
continue;
}
while (nums[j] = nums[j + 1]) j++; // 去重处理
while (nums[k] = nums[k - 1]) k--; // 去重处理
}
}
return res;
};
let nums = [-1,2,1,-4];
let target = 1;
console.log(threeSumClosest(nums, target)) // 1
target = 1
nums = [0, 0, 0]
console.log(threeSumClosest(nums, target)) // 0
target = 0
nums = [ 1, 1, 1, 1]
console.log(threeSumClosest(nums, target)) // 3