最接近的三數之和 - LintCode

描述
給一個包含 n 個整數的數組 S, 找到和與給定整數 target 最接近的三元組,返回這三個數的和。

只需要返回三元組之和,無需返回三元組本身

樣例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元組是 -1 + 2 + 1 = 2.

挑戰
O(n^2) 時間, O(1) 額外空間。

思路
由於不需要返回三元組本身,可以對數組排序。對於位置i,j = i + 1,k = len - 1,根據sum = nums[i] + nums[j] + nums[k]與target的大小來調整j,k的值。

#ifndef C59_H
#define C59_H
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
    int threeSumClosest(vector<int> nums, int target) {
        // write your code here
        if (nums.empty()|| nums.size()<3)
            return 0;
        int len = nums.size();
        int res = nums[0]+nums[1]+nums[len-1];
        //只尋找三元組不必考慮順序
        sort(nums.begin(), nums.end());
        //當sum大於target,k向前移動,sum值變小
        //當sum小於target,j向後移動,sum值變大
        for (int i = 0; i < len - 2; ++i)
        {
            int j = i + 1;
            int k = len - 1;
            while (j < k)
            {
                int sum = nums[i] + nums[j] + nums[k];
                res = absVal(res - target)<absVal(sum - target) ? res : sum;
                if (sum>target)
                    --k;
                else if (sum == target)
                    return target;
                else
                    ++j;
            }
        }
        return res;
    }
    int absVal(int a)
    {
        if (a >= 0)
            return a;
        else
            return -a;
    }
};
#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章