16.最接近的三数之和(LeetCode)(中等)

本文介绍了一种解决三数之和最接近目标问题的高效算法,通过先排序再使用双指针技术,将时间复杂度降低到O(n^2)。详细解析了算法步骤,并提供了完整的Java代码实现。

这题重点在于先排序,排序顶多O(n^2),然后后面控制第一个,对让第二三个分别位于数组两边往中间夹,也是 O(n^2),加起来O(n^2)。如果暴力破解的话三个for循环就要O(n^3)了

class Solution {
    public int threeSumClosest(int[] nums, int target) 
    {
        Arrays.sort(nums);//java自带快排
        int closestSum =nums[0]+nums[1]+nums[nums.length-1];
        int sum;
        for(int i=0;i<=nums.length-3;i++)//减3因为最后三个数
        {
        	int start=i+1;//第二个数的指针从i后一位开始
        	int end=nums.length-1;//第三个数的指针从最后一位开始
        	while(start<end)
        	{
        		sum=nums[i]+nums[start]+nums[end];
        		//如果sum比target小,那么让sum大一点,即start加1
        		if(sum<target)
        		{
        			start=start+1;
        		}
        		//如果sum比target小,那么让sum大一点,即start加1
        		else if(sum>target)
        		{
        			end=end-1;
        		}
        		//一样可以直接输出,因为题目假定唯一最近
        		else 
        		{
        			return sum;
        		}
        	//sum要比closestSum离target更近,才能更新cloestSum
        		if(Math.abs(sum-target)<Math.abs(closestSum-target))
        		{
        			closestSum=sum;
        		}        		
        	}
        }
        return closestSum;
        
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值