您的位置:首页 > 其它

LeetCode 16 3Sum Closest

2017-01-24 14:25 423 查看
题意:

给出数组s和目标target,要求从中选出3个数字,使其相加的和最接近target。

思路:

x sum系列的题目,在这里做一个总结。

最经典的情况为2 sum问题,即给出s和target找出s[i] + s[j] = target。

可以使用枚举s[i]判断target - s[i]是否在s中出现且与s[i]不同的O(nlogn)方法,用map或排序后二分查找的方式均可。

也可以使用夹逼搜索的方法,即先将s排序,指针l指向s头,r指向s尾,若s[l] + s[r] < target则++l否则--r。

这种方法的思想类似于枚举s[l],判断target - s[l]是否等于s[r]。如果s[r] > target - s[l],那么r应该指向更小的值,否则说明这个s[l]找不到合适的s[r],这时就枚举下一个s[l]。

排序O(nlogn),夹逼搜索O(n),也就是说2 sum问题可以O(nlogn)解决。

x sum问题可以通过枚举1个数字转化成x-1 sum问题,这样不断转化直到2 sum为止。

本题求closest,那么只需要记录一下当前搜索的数字的和sum与target的差距即可。

代码:

//
// Created by 房籽呈 on 2017/1/24.
//

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(); ++i) {
for (int l = i + 1, r = nums.size() - 1; l < r;) {
int sum = nums[i] + nums[l] + nums[r];
if (abs(sum - target) < abs(ans - target)) {
ans = sum;
if (ans == target) {
return target;
}
}
if (sum < target) {
++l;
} else {
--r;
}
}
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: