16. 最接近的三数之和
1.双指针法
-
因为本题不需要保留可能结果的数字序列,只需要返回最符合条件的和,所以在和等于target的时候可以直接退出。也可以利用去除重复元素的方式减小遍历计算次数。
-
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int ind1,ind2,ind3,n=nums.size(),min_dis=1000000,result; for(int ind1=0;ind1<n-2;ind1++){ ind2=ind1+1; ind3=n-1; while(ind2<ind3){ int now_val=nums[ind1]+nums[ind2]+nums[ind3]; if(abs(now_val-target)<min_dis){ min_dis=abs(now_val-target); result=now_val; } if(now_val<target){ ind2++; while(ind2<ind3&&nums[ind2]==nums[ind2-1]){ind2++;}//去掉重复值,减小遍历 }else if(now_val>target){ ind3--; while(ind2<ind3&&nums[ind3]==nums[ind3+1]){ind3--;}//去掉重复值,减小遍历 }else{//正好等于target时,就不会有更好的结果出现了,直接返回 return result; } } } return result; } };