[leetcode_16]3Sum Closest

给定一个 array,和一个 target,要求求 array 中三个数之和与 target 最接近。保证唯一解。
直接暴力会超时。
可以排序,两层暴力,然后第三层用二分。就不会超时了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int cmp(int a,int b) {
    return a < b;
}
class Solution {
public:
    int bSearch(int tmp,int left,vector<int>&num,int right) {
        if(right - left <= 1) {
            if(abs(tmp - num[left]) < abs(tmp - num[right])) {
                return num[left];
            }
            else {
                return num[right];
            }
        }
        int mid = (left + right) / 2;
        if(num[mid] == tmp)return tmp;
        else
            if(num[mid] > tmp) {
                return bSearch(tmp,left,num,mid-1);
            }
            else {
                return bSearch(tmp,mid+1,num,right);
            }
    }
    int threeSumClosest(vector<int> &num, int target) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        int sum = 0;
        int dis = 0xffff;
        sort(num.begin(),num.end(),cmp);
        for(int i = 0;i < num.size()-2;i++) {
            for(int j = i+1;j < num.size()-1;j++) {
                int tmp = num[i] + num[j];
                tmp += bSearch(target-tmp,j+1,num,num.size()-1);
                if(abs(tmp-target) < dis) {
                    sum = tmp;
                    dis = abs(tmp-target);
                }
            }
        }
        return sum;
    }
};
Licensed under CC BY-NC-SA 4.0