http://oj.leetcode.com/problems/3sum-closest/
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2). |
思路:
先排序,然后对任意a[i]取j = i + 1,k = S.size() - 1,比较abs(a[i] + a[j] + a[k] - target),当差小于等于0时,j往后走,反之k往前走。
1 class Solution { 2 public: 3 int threeSumClosest(vector<int> &num, int target) { 4 int closet_sum = 0, diff = INT_MAX, size = num.size(); 5 6 sort(num.begin(), num.end()); 7 8 for (int i = 0; i < size; ++i) { 9 int j = i + 1, k = size - 1; 10 11 while (j < k) { 12 int sum = num[i] + num[j] + num[k]; 13 int d = abs(sum - target); 14 15 if (d < diff) { 16 diff = d; 17 closet_sum = sum; 18 } 19 20 if (d > 0) { 21 int tmp; 22 23 if ((sum - target) < 0) { 24 tmp = j + 1; 25 26 while ((tmp < k) && (num[j] == num[tmp])) { 27 ++tmp; 28 } 29 30 j = tmp; 31 } 32 else { 33 tmp = k - 1; 34 35 while ((tmp > j) && (num[tmp] == num[k])) { 36 --tmp; 37 } 38 39 k = tmp; 40 } 41 } 42 else { 43 return closet_sum; 44 } 45 } 46 } 47 48 return closet_sum; 49 } 50 };