3Sum Closest

一. 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;
}

代碼的時間複雜度爲O(n2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章