Leetcode 16. 最接近的三数之和 及后继几题

地址 https://leetcode-cn.com/problems/3sum-closest/

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。
返回这三个数的和。假定每组输入只存在唯一答案。 示例: 输入:nums
= [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。 提示: 3 <= nums.length <= 10^3 -10^3 <= nums[i] <= 10^3 -10^4 <= target <= 10^4

解答

排序后 遍历数组 以不重复的数字作为第一个数

然后双指针 得到剩余的两数 计算最接近的方案

复杂度O(n2)

 

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        if (nums.size() == 3) {
            return  (nums[0] + nums[1] + nums[2]);
        }
        sort(nums.begin(), nums.end());
        int preV = 100010; //大于题目范围即可 这是使用的是上题的值
        int dis = 9999999; int ans = 9999999;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == preV) continue;
            int l = i + 1; int r = nums.size() - 1;
            while (l < r) {
                if (nums[i] + nums[l] + nums[r] == target) {
                    return target;
                }
                else if (nums[i] + nums[l] + nums[r] > target) {
                    if (dis > abs((nums[i] + nums[l] + nums[r]) - target)) {
                        dis = abs((nums[i] + nums[l] + nums[r]) - target);
                        ans = nums[i] + nums[l] + nums[r];
                        //cout << "dis = " << dis << ". ans = " << ans << endl;
                    }
                    r--;
                }
                else if (nums[i] + nums[l] + nums[r] < target) {
                    if (dis > abs((nums[i] + nums[l] + nums[r]) - target)) {
                        dis = abs((nums[i] + nums[l] + nums[r]) - target);
                        ans = nums[i] + nums[l] + nums[r];
                        //cout << "dis = " << dis << ". ans = " << ans << endl;
                    }
                    l++;
                }
            }
            preV = nums[i];
        }

        return ans;
    }
};

 

next LeetCode 017. 电话号码的字母组合 dfs

next next Leetcode 018. 四数之和 双指针

LeetCode 020. 有效的括号 数据结构 栈

posted on 2021-03-11 15:11  itdef  阅读(94)  评论(0编辑  收藏  举报

导航