一. 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).
Difficulty:Medium
TIME:40MIN
解法
這道題和3Sum幾乎是一模一樣,但是不同的是這道題不是求剛好等於目標數的結果,而是求和目標數最接近的結果。
處理方式也是如出一轍,但是卻稍微有些不同,在考慮這些不同的時候也耗費我大量的時間:
- 由於我們是求最優結果,因此,不管是現在求得的結果比之前最優的結果好還是差,我們都需要移動下標,而且只能移動一邊的下標。
- 在while循環內部不應該排除相同的數,既然是求最優的結果,那麼就算現在求得結果比之前最優的結果好,也不能保證現在這兩個數的其中一個和其他數結合不能夠得到更優的結果(因此最多可以排除掉和其中一個數相同的所有數,但不能排除掉兩個)。
int threeSumClosest(vector<int>& nums, int target) {
int num = 0;
int dis = INT32_MAX;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size() - 2; i++) {
int left = i + 1;
int right = nums.size() - 1;
while(left < right) {
int sum = nums[left] + nums[right] + nums[i];
if(abs(sum - target) < dis) {
dis = abs(sum - target);
num = sum;
//這裏和3Sum有區別的地方就是隻能排除掉一邊相同的數
while(sum - target < 0 && left + 1 < right && nums[left] == nums[left + 1])
left++;
while(sum - target > 0 && left + 1 < right && nums[right] == nums[right + 1])
right--;
}
if(sum - target < 0)
left++;
else if(sum - target > 0)
right--;
else
return target;
}
if(nums[i + 1] == nums[i]) //這裏這樣的處理的原因和3Sum是一樣的
i++;
}
return num;
}
代碼的時間複雜度爲