3Sum Closest

如果在递归的最后环节是求两个数的和与target最近的情况,应该会快一些。当然,主要是为了解决4Sum及以上的情形,所以使用了dp加递归的方式,3Sum的情形使用非递归的方式会更快也会比较简洁。

 

class Solution {
 public:
  int threeSumClosest(vector<int> &num, int target) {
    // Start typing your C/C++ solution below
    // DO NOT write int main() function
    sort(num.begin(), num.end());
    return nSumClosest(num, target, 3, 0);
  }
 private:
  int nSumClosest(const vector<int> &num, int target, int n, int pos) {
    int len = num.size();
    int result = 0x0fffffff;
    if (n < 1 || len - pos < n) {
      return result;
    }
    
    if (n == 1) {
      return oneClosest(num, target, pos);
    }
    for (int i = pos; i <= len - n; ++i) {
      int part_result = nSumClosest(num, target - num[i], n - 1, i + 1);
      result = abs(part_result + num[i] - target) > abs(result - target) ?
      result : part_result + num[i];
    }
    return result;
  }
  
  int oneClosest(const vector<int> &num, int target, int pos) {
    int begin = pos;
    int end = num.size() - 1;
    int result = num[(begin + end) / 2];
    while (begin <= end) {
      int cur = (begin + end) / 2;
      if (num[cur] == target) {
        return num[cur];
      } else if (num[cur] < target) {
        begin = cur + 1;
      } else {
        end = cur - 1;
      }
      result = abs(target - num[cur]) > abs(result - target) ? result : num[cur];
    }
    return result;
  }
};

 

posted @ 2013-06-13 15:15  dmthinker  阅读(124)  评论(0)    收藏  举报