Exemplo n.º 1
0
 /**
  * @param numbers: Give an array numbers of n integer
  * @param target: An integer
  * @return: return the sum of the three integers, the sum closest target.
  */
 int threeSumClosest(vector<int> nums, int target) {
     // write your code here
     sort(nums.begin(), nums.end());
     int closest = INT_MAX;
     for (size_t i = 0; i + 2 < nums.size(); ++ i) {
         int temp = twoSumClosest(nums, i + 1, target - nums[i]);
         if (abs(closest) > abs(temp)) {
             closest = temp;
         }
     }
     return closest + target;
 }
Exemplo n.º 2
0
	int threeSumClosest(vector<int> &num, int target) {
		if (3 > num.size())
			return target;
		sort(num.begin(), num.end());

		/* init of iRet & iMin(below) can't be 0x7fffffff, avoid abs overflow */
		int iRet(999999), i(0);
		while (i < num.size() - 2) {
			int iTmp = twoSumClosest(num, i, target);
			if (abs(iTmp, target) < abs(iRet, target))
				iRet = iTmp;

			++i;
			while (num[i] == num[i-1] && i < num.size())
				++i;
		}

		return iRet;
	}
Exemplo n.º 3
0
    int threeSumClosest(vector<int>& nums, int target)
    {
        int differ = numeric_limits<int>::max();
        sort(nums.begin(), nums.end());

        for (int i = 0; i + 2 < nums.size(); i++)
        {
            if (i > 0 && nums[i] == nums[i - 1])  // pass duplicates.
            {
                continue;
            }

            auto diff = twoSumClosest(nums, i + 1, target - nums[i]);
            if (abs(diff) < abs(differ))
            {
                differ = diff;
            }
        }
        return target + differ;
    }
/**3Sum Closest**/
int threeSumClosest(int* nums, int numsSize, int target) {
    void quicksort(int* s, int l, int r);//快排
	int twoSumClosest(int* nums,int numsSize, int target);//子问题 2sum
	int* temp=(int*)malloc(sizeof(int) * (numsSize-1)); //new int[numsSize-1];
	 quicksort(nums,0,numsSize-1);
	int start=0;
	int* interResult=(int*)malloc(sizeof(int) * (numsSize)); //new int[numsSize];
	for(int i=0;i<numsSize;i++){
		start=0;
		for(int j=0;j<numsSize;j++){
		     if(i==j) continue;
			 temp[start++]=nums[j];	 
		}
	    interResult[i]=nums[i]+twoSumClosest(temp,numsSize-1,target-nums[i]);
	} 
	int result=interResult[0];
	for(int k=1;k<numsSize;k++){
       if(abs(result-target)>abs(interResult[k]-target))
		   result=interResult[k];
	}
	return result;
}