问题:
这里为什么不需要去重呢回答:
因为这个题最终返回的是三个数的和,所以重复的方案没有关系,15题返回的是方案,所以不能重复所以需要去重
参考 LC15. 三数之和
使用pair<int, int>
返回结果
考虑两种情况:(最接近target
的数)
1. 大于等于target
的最小数
2. 小于等于target
的最大数
nums[i] + nums[j] + nums[k] >= target
然后, 求小于等于target
的最大数时不用重新写代码,只用带入k-1
就是小于等于target
的最大数
nums[i] + nums[j] + nums[k - 1] < target
比成立
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
pair<int, int> res (INT_MAX, INT_MAX);
for (int i = 0; i < nums.size(); i ++)
for(int j = i + 1, k = nums.size() - 1; j < k; j ++) {
while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= target) k --;
int s = nums[i] + nums[j] + nums[k];
res = min(res, make_pair(abs(s - target), s));
if (j < k - 1) {
s = nums[i] + nums[j] + nums[k - 1];
res = min(res, make_pair((target - s), s));
}
}
return res.second;
}
};