LeetCode (16)3Sum Closest

(16)3Sum Closest

題目:在一個數組裏找到和目標結果最爲接近的三個數字的和,返回此和數。

例子:

所給數組爲 S = {-1,2,1,-4},同時目標結果target = 1。
數組中最接近目標結果的三個數字之和爲2。(-1 + 2 + 1 = 2)。

根據題目的特點,尤其是有第15題的鋪墊,整個題目就相當於把和數等於0改成可變的和數的情況,同時使用std::min,和std::abs的方法將和數與target的差計算出來,獲取最小的即可。

下面是代碼:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int len = nums.size();
        if(len == 0){
            return 0;
        }
        sort(nums.begin(), nums.end());
        int i, j, k;
        int minnum = 99999;
        for(i=0;i<len;i++){
            if(i!=0){
                if(nums[i] == nums[i-1]){
                    continue;
                }
            }
            int targetnum = target;
            targetnum -= nums[i];
            j = i + 1;
            k = len - 1;
            while(j<k){
                    while(j<k&&j!=(i+1)&&nums[j]==nums[j+1]){
                        j ++;
                    }
                    while(j<k&&k<(len-1)&&nums[k]==nums[k-1]){
                        k --;
                    }
                if(nums[j] + nums[k] == targetnum){
                    printf("%d   %d   %d\n",nums[i],nums[j],nums[k]);
                    return target;
                }
                else if(nums[j] + nums[k] < targetnum){
                    if(abs(target - minnum)< abs(targetnum - nums[j] - nums[k])){
                        minnum = minnum;
                    }
                    else{
                        minnum = nums[i] + nums[j] + nums[k];
                    }
                    j ++;
                }
                else{
                    if(abs(target - minnum)< abs(targetnum - nums[j] - nums[k])){
                        minnum = minnum;
                    }
                    else{
                        minnum = nums[i] + nums[j] + nums[k];
                    }
                    k --;
                }
            }
        }
        return minnum;
    }
};
發佈了48 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章