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.