思路(排序+双指针法)
(与上一题有点相似,借助上一题的思路)
这题其实可以不用去重,就能求得。
(我先不用去重做的。想试试去重,结果又是各种坑)
代码
没有考虑元素去重的代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {
nums = nums.sort((a, b) => a - b);
var res;
var abs = Number.MAX_VALUE;
for (let i = 0; i < nums.length; i++) {
let left = i + 1;
let right = nums.length - 1;
while (left < right) {
if (Math.abs(target - nums[i] - nums[left] - nums[right]) < abs) {
abs = Math.abs(target - nums[i] - nums[left] - nums[right]);
res = nums[i] + nums[left] + nums[right];
}
if (target - nums[i] == nums[left] + nums[right]) return res;
else if (target - nums[i] > nums[left] + nums[right]) left++;
else if (target - nums[i] < nums[left] + nums[right]) right--;
}
}
return res;
};
考虑元素去重的代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {
nums = nums.sort((a, b) => a - b);
var res;//返回值
var abs = Number.MAX_VALUE;//abs(target-三数之后)
for (let i = 0; i < nums.length-2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
let left = i + 1;
let right = nums.length - 1;
while (left < right) {
if (Math.abs(target - nums[i] - nums[left] - nums[right]) < abs) {//看(target-三数之后)的绝对值是不是更小了,是的话更替
abs = Math.abs(target - nums[i] - nums[left] - nums[right]);
res = nums[i] + nums[left] + nums[right];
}
if (target - nums[i] == nums[left] + nums[right]) return res;
else if (target - nums[i] > nums[left] + nums[right]) {
left++;
while(left < right && nums[left] == nums[left - 1]) left++;//第二个数去重(不去重也可以,增加效率)
}
else if (target - nums[i] < nums[left] + nums[right]) {
right--;
while(left < right && nums[right] == nums[right + 1]) right--;//第二个数去重(不去重也可以,增加效率)
}
}
}
return res;
};