题目来源
题目描述
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1
示例 2
提示
- 3 <= nums.length <= 1000
- -1000 <= nums[i] <= 1000
- -10^4 <= target <= 10^4
题目解析
本题找三元组的过程与:LeetCode - 15 三数之和-CSDN博客 一致,具体逻辑,可以看下这篇博客。
本题要求的是最接近taget的三数之和,因此我们在找三元组的过程中,只要保留和target差距最小的三元组之和即可。
C源码实现
int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
int threeSumClosest(int* nums, int numsSize, int target) {
qsort(nums, numsSize, sizeof(int), cmp);
int ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < numsSize - 2; i++) {
int l = i + 1;
int r = numsSize - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (abs(ans - target) > abs(sum - target)) {
ans = sum;
}
if (sum > target) {
r--;
} else if (sum < target) {
l++;
} else {
return sum;
}
}
}
return ans;
}
C++源码实现
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.size() - 2; i++) {
int l = i + 1;
int r = nums.size() - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (abs(ans - target) > abs(sum - target)) {
ans = sum;
}
if (sum > target) {
r--;
} else if (sum < target) {
l++;
} else {
return sum;
}
}
}
return ans;
}
};
Java源码实现
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length - 2; i++) {
int l = i + 1;
int r = nums.length - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (Math.abs(ans - target) > Math.abs(sum - target)) {
ans = sum;
}
if (sum > target) {
r--;
} else if (sum < target) {
l++;
} else {
return sum;
}
}
}
return ans;
}
}
Python源码实现
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
ans = nums[0] + nums[1] + nums[2]
for i in range(len(nums) - 2):
l = i + 1
r = len(nums) - 1
while l < r:
total = nums[i] + nums[l] + nums[r]
if abs(ans - target) > abs(total - target):
ans = total
if total > target:
r -= 1
elif total < target:
l += 1
else:
return total
return ans
JavaScript源码实现
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function (nums, target) {
nums.sort((a, b) => a - b);
let ans = nums[0] + nums[1] + nums[2];
for (let i = 0; i < nums.length - 2; i++) {
let l = i + 1;
let r = nums.length - 1;
while (l < r) {
const sum = nums[i] + nums[l] + nums[r];
if (Math.abs(ans - target) > Math.abs(sum - target)) {
ans = sum;
}
if (sum > target) {
r--;
} else if (sum < target) {
l++;
} else {
return sum;
}
}
}
return ans;
};