EX:
nums = [-1,2,1,-4], target = 1
Ans: 2, Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
想法:
這題跟 15. 3Sum 很像,基本上都是同樣的作法,主要差別在於 15 必須要過濾掉相同的解,而這題基本上只會有一個解,因此只需要像 15 題一樣先固定一個數,然後在用 Two Pointer 找出剩下可能的組合並計算三數之和更新目前離 target 最近的值即可。
Complexity: O(nlogn + n^2) time.
完整程式碼:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int closest = 100000;
for (int k = 0; k < nums.size() - 2; k++) {
int complement = target - nums[k];
int i = k + 1;
int j = nums.size() - 1;
while (i < j) {
int sum = nums[i] + nums[j] + nums[k];
int diff = target - sum;
if (abs(target - closest) > abs(diff)) {
closest = sum;
}
if (closest == target) { return closest; }
// if use this may omit the solution that i, j element have same value.
// ex: [-1, 0, 1, 1, 55], target = 3, will omit solution 0, 1, 1
//while (i < j && nums[i] == nums[i + 1]) { i++; }
//while (i < j && nums[j] == nums[j - 1]) { j--; }
if (diff > 0) { i++; }
else { j--; }
}
}
return closest;
}
};
沒有留言:
張貼留言