您的位置:首页 > 其它

3Sum Closest

2015-09-05 11:49 369 查看


3Sum Closest

Total Accepted: 49672 Total
Submissions: 184745My Submissions

Question
Solution

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).

先排序,遍历第一个指针,后两个指针从剩余的数两头往中间走

class Solution {
public:
int threeSumClosest(vector<int>& nums, int target)  {
int size = nums.size();
if(size == 0)
return 0;
else if(size == 1)
return nums[0];
else if( size == 2)
return nums[0] + nums[1];

//排序
int *number = new int[size];
for( int i = 0; i < size; i++)
number[i] = nums[i];
QuickSort(number, size);
//求和
int mid,right = size - 1,dif = INT_MAX,sum,result = 0;
for( int i = 0;i < size - 2; i++)
{
if( i != 0 && number[i] == number[i-1])
continue;
mid = i + 1;
right = size - 1;
while(mid < right)
{

if( number[mid] == number[mid -1] && mid > i+1)
{   mid ++;
continue;
}
sum = number[i] + number[mid] + number[right];
if( target == sum )
return target;
else if(target < sum)
{
if( dif > sum - target)
{
dif = sum - target;
result = sum;
}
right --;
}
else
{
if( dif > target - sum)
{
dif = target - sum;
result = sum;
}
mid ++;
}

}
}
delete []number;
return result;
}
//从小到大排序
void QuickSort(int *num, int size)
{
if( size <= 1) return;
int mid = num[size - 1],tmp, i = 0,j = 0;
for(; i < size - 1; i ++)
{
if( num[i] < mid)
{
tmp = num[i];
num[i] = num[j];
num[j] = tmp;
j++;
}
}
num[size - 1] = num[j];
num[j] = mid;
if(j > 1)
QuickSort(num, j );
if(j < size - 2)
QuickSort(num + j + 1, size - j - 1);
}
};


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: