LeetCode--3Sum Closest

5 篇文章 0 订阅
本文深入解析了3SumClosest算法,该算法旨在寻找数组中三个整数的和最接近给定目标值的解决方案。通过对数组进行排序,并使用双指针技术,有效地解决了这一问题。文章提供了详细的算法步骤及C语言实现代码。
摘要由CSDN通过智能技术生成

#3Sum Closest
##题目
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

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

##分析
求三个数的和的时候,我们可以先确定一个选定的数,然后通过另外两个数的和来确定答案,我们先将数组排好序,设定两个下标,一个是选定的下标的下一个,另外一个是数组的最后一个,将三个数相加,有一下三种情况:

  1. 和==target,直接返回。
  2. 和 < target,记录当前的和并比较,然后小的下标往前移动。
  3. 和 > target。记录当前的和并比较,然后大的下标往前移动。
    最后通过记录的和与target相差最小的值,返回。

##源码

int threeSumClosest(int* nums, int numsSize, int target) {
	//对数组进行排序
	for(int i = 0; i < numsSize; i++) {
		for(int j = 0; j < numsSize - i - 1; j++) {
			if(nums[j] > nums[j+1]) {
				int temp = nums[j];
				nums[j] = nums[j+1];
				nums[j+1] = temp;
			}
		}
	}
	int tag = 9999;
	int flat = -1;
	//思路是先选定一个下标,通过另外两个数字的和确定最小的。从两边开始
    for(int i = 0 ; i < numsSize; i++) {
    	int begin = i + 1;
    	int end =  numsSize - 1;
    	int left = target - nums[i];
    	
    	while(begin < end) {
    		int sum = nums[begin] + nums[end];
    		if(sum < left) {
    			begin++;
    			if(abs(left - sum) < tag) {
    				tag = abs(left - sum);
    				flat = 0;
    			}
    		} else if(sum > left) {
    			end--;
    			if(abs(left - sum) < tag) {
    				tag = abs(left - sum);
    				flat = 1;
    			}
    		} else {
    			return (nums[i] + nums[begin] + nums[end]);
    		}
    	}
    }
    if(flat == 0) {
    	return target-tag;
    } else {
    	return target+tag;
    }
}

更多技术博客https://vilin.club/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值