与3sum、4sum等类似,先对数组进行排序。
然后与3Sum, 4Sum不同的是,3Sum, 4Sum可以进行剪枝,比如若排序后的当前值已经大于target且大于0,则后面没必要再进行后面的判断,而在这里则不然,还要接着进行判断,或者更改判断条件。
加入剪枝的代码如下:
1 class Solution { 2 public: 3 int inner_abs(int a, int b) { 4 return a-b<0?b-a:a-b; 5 } 6 int threeSumClosest(vector<int>& nums, int target) { 7 8 sort(nums.begin(), nums.end()); 9 int result = nums[0]+nums[1]+nums[2], min_diff=0x7ffff; 10 for(size_t i=0;i<nums.size()-2;i++) { 11 if (i>0 && nums[i] == nums[i-1]) continue; 12 if (i>0 && nums[i] > 0 && nums[i] >= target) break; 13 int cur_target = target-nums[i]; 14 for (size_t j=i+1;j<nums.size()-1;j++) { 15 if (j-i>1 && nums[j]==nums[j-1]) continue; 16 if (i-1>1 && nums[j]>0 && nums[j]>=cur_target) break; 17 int left_pt = j, right_pt=nums.size()-1; 18 while(left_pt<right_pt) { 19 int cur_sum = nums[i] + nums[left_pt] + nums[right_pt]; 20 int cur_abs = inner_abs(cur_sum, target); 21 if (cur_abs < min_diff) { 22 result = cur_sum; 23 min_diff = cur_abs; 24 } 25 if (cur_sum > target) { 26 right_pt--; 27 } else if (cur_sum < target) { 28 left_pt++; 29 } else { 30 return result; 31 } 32 } 33 } 34 } 35 return result; 36 } 37 };
这样能够accept, 但时间较长