leetcode 第15-16题 3Sum & 3Sum Closest

来源:互联网 发布:python 数学库 开平方 编辑:程序博客网 时间:2024/06/05 16:43

3Sum这道题的思路可以将 2sum的思路进行扩展,即将3个数的和看成一个是-target ,然后去找何为target的另外两个数,该题需要注意的一个问题就是判重,即相同的解取一次即可,需要在取值的时候每次做一次判断。


class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        int len =num.size();
         
        vector <vector<int> >ans;
        ans.clear();
         //cout<<len<<endl;
        sort(num.begin(),num.end());
       
        for(int i=0;i<len;i++){
            if(i > 0 && num[i]==num[i-1])  
                continue; 
            int k=len-1;
            for(int j=i+1;j<k;){
                 if((j>i+1)&&num[j-1]==num[j]){j++;continue;}    
                 if(k<num.size()-1&& num[k]==num[k+1]){ 
                     k--;continue;
                 }
                 int sum=num[i]+num[j]+num[k];
                 if(sum>0)k--;
                 else if(sum<0)j++;
                 else{
                     vector<int >s;
                     
                    s.push_back(num[i]); 
                    s.push_back(num[j]);
                    s.push_back(num[k]);
                    ans.push_back(s);
                    j++;
                 }
                      
             }
        
        
        }
    return ans;
    }
};

//3Sum Closest只需要对上题的代码稍加修改,每次记录求和的最接近target的值即是所求的解。  

 class Solution {
public:
     int threeSumClosest(vector<int> &num, int target) {
        int len =num.size();
        int temp=0x7fffffff;
        sort(num.begin(),num.end());
        for(int i=0;i<len;i++){
            if(i > 0 && num[i]==num[i-1])  
                continue; 
            int k=len-1;
            for(int j=i+1;j<k;){
                 if((j>i+1)&&num[j-1]==num[j]){j++;continue;}    
                 if(k<num.size()-1&& num[k]==num[k+1]){ 
                     k--;continue;
                 }
                 int sum=num[i]+num[j]+num[k]-target;
                 if(abs(sum)<abs(temp))temp=sum;
                 if(sum>0)k--;
                 else if(sum<0)j++;
                 else{
                     return target;
                 }
                      
             }
        
        }
   return target+temp;
    }
};

0 0
原创粉丝点击