最接近的三数之和

求取数组中三个数和最接近目标值
在这里插入图片描述
值得注意的是;1.题中提到的与target最接近的是三个整数的和
2.数组中n个整数,只取三个数

原本的思路:

  1. 先进行数组排序,利用二分法找出中间值与target进行比较

  2. 要求三个整数的和与target最接近,只需要找出数组中与target最接近的三个整数,在进行相加
    代码如下`class Solution {
    public int threeSumClosest(int[] nums, int target) {

             int closeNum = nums[0]+nums[1]+nums[2];
            Arrays.sort(nums);
            int n = nums.length;
            for(int i = 0;i < n-2;i++){
            	int begin = 0;
            	int sum = 0;
            	int end = nums.length-1;
            	int m = (begin+end)/2;
            	if(nums[m]==target) {
            		sum = nums[m]+nums[m-1]+nums[m+1];
            		 System.out.println(sum);
            	}else if(nums[m]<target&&target<nums[end]&&nums[m]>target&&target>nums[begin]) {
            		sum = nums[target]+nums[target-1]+nums[target+1];
            		 System.out.println(sum);
            	}else if(target>nums[end]) {
            		sum = nums[end-2]+nums[end-1]+nums[end];
            		 System.out.println(sum);
            	}else if(target<begin){
            	sum = nums[begin]+nums[begin+1]+nums[begin+2];
            	System.out.println(sum);
            	}
            }
            
    		return closeNum;
    

    }
    }
    但是其中当target处于大于中间值小于最后一个元素,或是目标值大于第一个元素小于中建值时,无法判定周围的元素是最接近目标值的,根据网上其他解答者代码如下

class Solution {
    public int threeSumClosest(int[] nums, int target) {
         int closeNum = nums[0]+nums[1]+nums[2];
        Arrays.sort(nums);
        int n = nums.length;
        for(int i = 0;i < n-2;i++){
            //去重
            if(i > 0 && nums[i] == nums[i-1]) continue;
            int left = i+1,right = n-1;
            //找出与target差值最小的和
            while(left < right){
                int nowNum = nums[i]+nums[left]+nums[right];
                if(Math.abs(nowNum - target) < Math.abs(closeNum - target)){
                    closeNum = nowNum;
                }
                if(nowNum - target > 0){
                    right--;
                }else if(nowNum - target < 0){
                    left++;
                }else{
                    return target;
                }
            }
        }
        return closeNum;
    }
}
    

针对上述提出的问题,如果有更好的解决办法请及时提出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值