4/02/2014

Leetcode -- 3Sum Closest

 
class Solution {  
 public:  
   int threeSumClosest(vector<int> &num, int target) {  
     sort(num.begin(), num.end());  
     int n = num.size();  
     int distance = INT_MAX;  
     for(int i = 0; i < n - 2; i++) {  
       if(i > 0 && num[i] == num[i-1]) {  
         continue;  
       }  
       int newTarget = target - num[i];  
       int dist = twoSumCloset(num, i + 1,n - 1, newTarget);  
       if(dist == 0) {  
         return target;  
       } else {  
         if(abs(dist) < abs(distance)) {  
           distance = dist;  
         }  
       }  
     }  
     return distance + target;  
   }  
   int twoSumCloset(const vector<int>& num, int start, int end, int target) {  
     int distance = INT_MAX;  
     while(start < end) {  
       int sum = num[start] + num[end];  
       int dist = sum - target;  
       if(abs(dist) < abs(distance)) {  
         distance = dist;  
       }  
       if (sum > target) {   
      while(num[end] == num[--end]);   
     } else if (sum == target) {   
       return 0;   
     } else {   
      while(num[start] == num[++start]);   
     }   
     }  
     return distance;  
   }  
 };  

No comments: