算法Day3-3个数之和最接近

来源:互联网 发布:拉姆赞卡德罗夫 知乎 编辑:程序博客网 时间:2024/06/05 12:13

题目

给定n个整数的一个数组S,在S中找出3个数,其加和最接近一个给定的数target,返回这3个数的和。可以假设每一次输入都只有一个解决方案。例如,给定数组 S = {-1 2 1 -4},并且target = 1。最接近target的和是 2 。(-1+2+1=2)。

解析

本题又是第二天题“3个数之和”问题的拓展,解法和第二题类似,唯一的区别是在遍历的过程中,需要增加一个变量来记录遍历过程中的最小值。

代码

#include<iostream>#include<vector>#include<algorithm>using namespace std;int threeSumClosest( vector< int > &num, int target){    sort(num.begin(), num.end());    int len = num.size();    int minV = INT_MAX, record;             //存储minV最接近值,record记录加和    for(int i=0; i<len; i++)    {        int start = i + 1, end = len - 1;        while(start < end)        {            int sum = num[i] + num[start] + num[end];            if(sum == target)               //加和等于target,minV为0            {                minV = 0;                record = sum;                break;            }            if(sum < target)                //加和小于target,首指针++;            {                if(target-sum < minV)                {                    minV = target - sum;                    record = sum;                }                start++;            }            else                            //加和大于target,尾指针--;            {                if(sum-target < minV)                {                    minV = sum - target;                    record = sum;                }                end--;            }        }        if(record == target) break;        //去重 de-duplicate        while(i<len-1 && num[i] == num[i+1]) i++;    }    cout<<record<<endl;    return record;}//例如,给定数组 S = {-1 2 1 -4},并且target = 1。最接近target的和是 2 。(-1+2+1=2)。void main(){    int nums[] = {-1,2,1,-4};    vector<int> v;    for(int i=0; i < sizeof(nums)/4; i++)        v.push_back(nums[i]);    threeSumClosest(v,1);}
0 0
原创粉丝点击