threesum closest问题

http://www.leetcode.com/onlinejudge 里面的第二题

其实这是ThreeSum问题的一个扩展:
我写的第一个版本是这样的
这应该算一个典型的组合优化问题么???

class Solution2 {
public:
    int threeSumClosest(vector<int> &num, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int count=num.size();
        int i,least,revalue,p,q;
        sort(num.begin(),num.end());
        least=0x7FFFFFFF;
        for(i=0 ; i<count ; i++){
            int  inner;
            for(p=i+1,q=count-1 ; p<q ; ){
                if(q==i){
                        q--;
                    continue;
                }
                if(abs(num[i]+num[p]+num[q]-target)<least){
                    least=abs(num[i]+num[p]+num[q]-target);
                    revalue=num[i]+num[p]+num[q];
                    if(num[i]+num[p]+num[q]-target<0)
                        p++;
                    else
                        q--;
                }//already get the least now!
                else {
                    if(num[i]+num[p]+num[q]-target<0)
                        p++;
                    else
                        q--;
                }
            }
        }
        return revalue;
   }
}; 

后来在网上搜了一下,发现有位大哥的思路是这样的,其实相当于把我的判断简化了,我看了一下运行时间也提高一点

C++代码:

class Solution {
public:
    int threeSumClosest(vector<int> &num, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int count=num.size();
        int i,least,revalue,p,q;
        sort(num.begin(),num.end());
        least=0x7FFFFFFF;
        for(i=0 ; i<count ; i++){
            int  inner;
            for(p=i+1,q=count-1 ; p<q ; ){
                if(q==i){
                    q--;
                    continue;
                }
                if(abs(num[i]+num[p]+num[q]-target)<least){
                    least=abs(num[i]+num[p]+num[q]-target);
                    revalue=num[i]+num[p]+num[q];
                }
                if(num[i]+num[p]+num[q]-target<least)//what is this trick!!!!!!!!
                    p++;
                else
                    q--;
            }
        }
        return revalue;
   }
}; 

这其实是一个组合问题,关于数据的组合如何进行优化,通常先将所有的数据按照从小到大进行排序,然后采用首尾逼近的方法去排除很多组合。何谓首尾逼近,举个简单的例子:
现有一数组:int num[]={-5,-3,-2,0,1,4,6,7}. 如果想要找到两个和满足要求的数k,普通方法需要遍历n*(n-1)/2(这里的n为8)中组合。但是事实我们可以设置两个指针i,j,一个指向-5,一个指向7.

posted @ 2012-12-27 09:34  和道一文字  阅读(277)  评论(0编辑  收藏  举报