題目:給一個數組和給定的目標值,要求在數組裡找出三個元素,這三個元素的和最接近目標值,當然等於是最好的。
用3sum的方法,把判定條件作些修改。
int twoSum(vector&num, int start, int target) { if(num.size() < 3 || start >= num.size()) return -target; int head = start; int tail = num.size() - 1; int result = -target; int erro = 0x7fffffff; while (head < tail) { int sum = num[head] + num[tail]; if(sum == target) { result = target; return target; } else if(sum < target){ do { ++head; } while (head < tail && num[head] == num[head - 1]); } else { do { --tail; } while (tail > head && num[tail] == num[tail + 1]); } int curerro = abs(sum - target); if(curerro < erro) { result = sum; erro = curerro; } } return result; } int threeSumClosest(vector &num, int target) { const int len = num.size(); if(len < 3) return 0; sort(num.begin(), num.end()); int closet = -target; int erro = 0x7fffffff; for (int i = 0; i < len - 2; ++i) { int thisloop = twoSum(num, i + 1, target - num[i]); if(thisloop == target - num[i]) return target; int cur_erro = abs(thisloop + num[i] - target); if(cur_erro < erro) { closet = thisloop + num[i]; erro = cur_erro; } while(i + 1 < len && num[i + 1] == num[i]) ++i; } return closet; }