题目地址:
https://leetcode.com/problems/3sum-closest/
给定一个长度大于等于 3 3 3的数组 A A A,再给定一个数 t t t,要求从数组中挑三个数,使得其和与 t t t最接近(意思是差的绝对值最小)。求这个和。
思路是,先将数组排序,然后枚举第一个数 A [ i ] A[i] A[i],接着开两个指针 l l l和 r r r分别指向 i + 1 i+1 i+1和 n − 1 n-1 n−1,计算 s = A [ i ] + A [ l ] + A [ r ] s=A[i]+A[l]+A[r] s=A[i]+A[l]+A[r],如果 s > t s>t s>t,则说明可能让 r r r左移能得到更优解(此时 l l l右移不会得到更优解了);如果 s < t s<t s<t,则类似可以让 l l l右移能得到更优解,如果 s = t s=t s=t那当然直接返回 t t t即可。这样枚举的同时更新答案即可。代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
// 初始化res为前三个数之和
int res = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.size() - 2; i++) {
int l = i + 1, r = nums.size() - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
// 发现更接近的数了,更新res
if (abs(res - target) > abs(sum - target)) res = sum;
if (sum < target)
l++;
else if (sum > target)
r--;
else
return target;
}
}
return res;
}
};
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( 1 ) O(1) O(1)。