大致思路还和3Sum一样:先排序,然后固定第一个数,后面的范围用两个指针确定,当大于目标值时,右指针左移,当小于目标值时,左指针右移。
需要注意的:第一每次改变三个数其中一个都要再次计算总和,判断。
1 class Solution { 2 public: 3 int threeSumClosest(vector<int>& nums, int target) { 4 int closet=0,j,k,sum=0; 5 bool flag=false; 6 sort(nums.begin(),nums.end()); 7 if(nums.size()<3) 8 { 9 int s=0; 10 while(nums[s]) 11 closet+=nums[s++]; 12 return closet; 13 } 14 for(int i=0;i<nums.size()-2;i++) 15 { 16 j=i+1; 17 k=nums.size()-1; 18 if(!flag) 19 { 20 flag=true; 21 closet=nums[i]+nums[j]+nums[k]; 22 } 23 while(j<k) 24 { 25 sum=nums[i]+nums[j]+nums[k]; 26 if(abs(sum-target)<abs(closet-target)) 27 closet=sum; 28 if(sum<target) j++; 29 if(sum>target) k--; 30 if(sum==target) return target; 31 32 } 33 } 34 return closet; 35 } 36 };