和大神们学习每天一题(leetcode)-3Sum Closest

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

   For example, given array S = {-1 2 1 -4}, and target = 1.

    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

本题和3Sum那道题类似,不同点在于需要计算与目标值的差距。

功能测试用例:{ -1, 2, 1, -4 },4

特殊测试用例:{},0;{0},0;{0,0},0

class Solution
{
public:
	void FastSort(vector<int> &vsNumber, int nBegin, int nEnd)//快速排序
	{
		if (nBegin >= nEnd)
			return;
		int nPos1 = nBegin;
		int sNMiddle = vsNumber[nEnd], sNChange;
		for (int nPos2 = nBegin; nPos2 < nEnd; nPos2++)
		{
			if (vsNumber[nPos2] < sNMiddle)
			{
				sNChange = vsNumber[nPos1];
				vsNumber[nPos1] = vsNumber[nPos2];
				vsNumber[nPos2] = sNChange;
				nPos1++;
			}
		}
		vsNumber[nEnd] = vsNumber[nPos1];
		vsNumber[nPos1] = sNMiddle;
		FastSort(vsNumber, nBegin, nPos1 - 1);
		FastSort(vsNumber, nPos1 + 1, nEnd);
	}
	int threeSumClosest(vector<int> &num, int target)
	{
		if (num.size() < 3)
			return NULL;
		int nResult = NULL,nRemain,nBegin,nEnd,nClosest = INT32_MAX,nAbs;
		FastSort(num,0,num.size()-1);//对输入的向量中元素进行排序
		for (int nTemp = 0; nTemp < num.size() - 2; nTemp++)//遍历向量中的元素
		{
			nRemain = target - num[nTemp];//计算出减去当前值后的剩余值
			nBegin = nTemp + 1;
			nEnd = num.size() - 1;
			while (nBegin < nEnd)
			{
				nAbs = abs(num[nBegin] + num[nEnd] - nRemain);//计算与目标值差值的绝对值
				if (nAbs < nClosest)//与最小绝对值进行比较
				{
					nClosest = nAbs;
					nResult = num[nBegin] + num[nEnd] + num[nTemp];
				}
				if (num[nBegin] + num[nEnd] < nRemain)
				{
					nBegin++;
				}
				else if (num[nBegin] + num[nEnd] > nRemain)
				{
					nEnd--;
				}
				else
				{
					return target;
				}
			}
		}
		return nResult;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值