力扣:最接近的三数之和

1 问题描述

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

2 解决路线

利用排序和三指针解决。设置三个指针k, i, j指向数组不同的位置。

思路:

a.将nums数组由小到大排序。

b.固定3个指针中最边的k指针到nums数组最左端,循环。

c.在(k,nums.length-1)两端设置i,j两个指针,向内循环i,j指针。

d.如果nums[k]+nums[i]+nums[j]==target,相差0,返回三数之和;

e.更新当前最小差值,并把当前的三数之和赋值给result.

f.如果nums[k]+nums[i]+nums[j]>target,向左移动j指针;

如果nums[k]+nums[i]+nums[j]<target,向右移动i指针。

f.在移动3个指针的同时,跳过重复元素。

g.返回result,得到结果。

3 代码实现

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}
int threeSumClosest(int* nums, int numsSize, int target){
	int k, i, j, x = 20000, result = 0;
	//排序库函数 
	qsort(nums, numsSize, sizeof(int), cmpfunc);
	for(k = 0; k < numsSize-2; k++) {
        if(k > 0 && nums[k] == nums[k-1]) {
        	continue;
		}
		for(i = k+1, j = numsSize-1; i < j;) {
			if(i > k+1 && nums[i] == nums[i-1]) {
				i++;
				continue;
			}
			if(j < numsSize-1 && nums[j] == nums[j+1]) {
				j--;
				continue;
			}
			int sum = nums[k] + nums[i] + nums[j];
			if(sum == target) {
				return sum;
			} 
			if(abs(sum - target) <= x) {
					result = sum;
					x = abs(sum - target);
					
			}
		    if(sum > target) {
		    	j--;
			} else {
				i++;
			}
		}
	}
	return result;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值