[leetcode] 3sum closest

与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, 但时间较长

猜你喜欢

转载自www.cnblogs.com/lidouer/p/9170927.html
今日推荐