leetcode 16. 3Sum Closest

来源:互联网 发布:浙师大行知学院迎新网 编辑:程序博客网 时间:2024/05/01 11:11

题意

找三个数相加最接近的目标的数

题解

将数组排序后,枚举两个不重复的元素A和B,然后用lower_bound函数二分查找第一个大于等于剩余值的数,然后检查这个数和这个数左边的值是否离目标更近。

代码

class Solution {public:    int skip(vector<int>& nums, int i)    {        int size = nums.size();        while (i > 0 && i < size && nums[i] == nums[i - 1])            i++;        return i;    }    int threeSumClosest(vector<int>& nums, int target) {        vector<vector<int> > result;        int size = nums.size();        const int INF = 1000000;        int closest = INF; //the remain value of target        bool less_flag = false;        sort(nums.begin(), nums.end());        for (int i = 0; i < size; i++)        {            i = skip(nums, i); // skip repeated element            for (int j = i + 1; j < size; j++)            {                int remain = target - (nums[i] + nums[j]);                //int index = -1;                vector<int>::iterator pos;                if ((pos = lower_bound(nums.begin() + j + 1, nums.end(), remain)) == nums.end()) //compare one element                {                    //temp = temp > 0 ? temp : -temp;                    if (pos - 1 != nums.begin() + j)                    {                        int temp = (*(pos - 1) - remain);                        if (abs(temp) < closest)                        {                            if (temp < 0)                            {                                less_flag = true;                                temp = -temp;                            }                            else                                less_flag = false;                            closest = min(temp, closest);                        }                    }                }                else // compare two elements                {                    int temp = (*pos - remain);                    //temp = temp > 0 ? temp : -temp;                    if (abs(temp) < closest)                    {                        if (temp < 0)                        {                            less_flag = true;                            temp = -temp;                        }                        else                            less_flag = false;                        closest = min(temp, closest);                    }                    if (pos - 1 != nums.begin() + j)                    {                        temp = (*(pos - 1) - remain);                        if (abs(temp) < closest)                        {                            if (temp < 0)                            {                                less_flag = true;                                temp = -temp;                            }                            else                                less_flag = false;                            closest = min(temp, closest);                        }                    }                }                while (j > 0 && j < size - 1 && nums[j] == nums[j + 1]) // skip the repeated elements                    j++;            }        }        if (less_flag) // result < target,            return target - closest;        else            return target + closest;    }};
0 0
原创粉丝点击