首页 » 编程之美 » 正文

[leetcode_16]3Sum Closest

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

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;
    }
};

发表评论