leetcode 最接近的三数之和

题目描述:

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

思路:

先从小到大排序,然后定三个索引,i = 0, j = i+1, k = nums.size() -1,以i 为基准,向右移动 j 或者向左移动 k,找到最接近目标的和,如果和小于target, 则为了增大和,向右移动 j, 反之,向左移动 k

C++代码:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int closest = nums[0] + nums[1] + nums[2]; // 结果
        int diff = abs(closest - target);
        sort(nums.begin(), nums.end());
        
        for (int i = 0; i < nums.size() - 2; ++i) { // i为基准
            int left = i + 1, right = nums.size() - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right]; 
                int newDiff = abs(sum - target);
                if (diff > newDiff) { // 找到差异更小的,更新,并记录结果
                    diff = newDiff;
                    closest = sum;
                }
                if (sum < target) ++left; // 和如果小于target,则为使和更大,移动left
                else --right; // 和如果大于target,则为使和更小,移动right
            }
        }
        return closest;
    }
};

猜你喜欢

转载自blog.csdn.net/jizhidexiaoming/article/details/84313810
今日推荐