题目描述
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路
考虑用双指针法解题。首先将数组从小到大排序,并令最接近的数closest初始化为前三个数的和。每遍历到一个数,计算后面两个数之和比较的目标tar=target-nums[i],然后令左指针left指向其后第一个数,右指针right指向最后一个数,然后计算左右指针指向数字之和与tar的差sum。
- 若sum为0,则说明此时三个数的和正好为target,所以直接返回target
- 若sum的绝对值小于closest-target的绝对值,说明此时三个数的和为最接近target的数,所以更新closest
- 若左右指针指向的数字之和小于tar,此时令左指针向右移动一位有可能让和更接近tar;否则让右指针左移一位。这样移动直到左右指针重合
代码
1 class Solution { 2 public: 3 int threeSumClosest(vector<int>& nums, int target) { 4 sort(nums.begin(),nums.end()); 5 int closest=nums[0]+nums[1]+nums[2],l=nums.size(); 6 for(int i=0;i<l-2;i++){ 7 int left=i+1,right=l-1; 8 int tar=target-nums[i]; 9 int sum; 10 while(left<right){ 11 sum=nums[left]+nums[right]-tar; 12 if(sum==0) 13 return target; 14 if(abs(sum)<abs(closest-target)) 15 closest=target+sum; 16 if(nums[left]+nums[right]<tar) 17 left++; 18 else 19 right--; 20 } 21 } 22 return closest; 23 } 24 };