给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/3sum-closest 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路:双指针
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { int threeSum=0; int len=nums.size(); int minsum=1e7;//记录三个数字最小和 if(len==3) { return nums[0]+nums[1]+nums[2]; } sort(nums.begin(),nums.end());//按升序对元素进行排序 for(int i=0;i<len;i++) { if(i>0&&nums[i]==nums[i-1]) //元素去重 continue; int left=i+1; int right=len-1; while(right>left) { threeSum=nums[i]+nums[left]+nums[right]; if(threeSum==target) return target; else if(abs(threeSum-target)<abs(minsum-target)) minsum=threeSum; else if(threeSum>target){//右指针向右移动总和减少 int rig=right-1; while(rig>left&&nums[rig]==nums[right]) {rig--;}// 右边元素和前一个元素重复 right=rig; } else{ int lef=left+1;//左指针向左移动总和增加 while(lef<right&&nums[left]==nums[lef]){lef++;}//左边元素和后一个元素重复 left=lef; } } } return minsum; } };