Leetcode - 3Sum Closest - Java

问题是需要找三个数字之和离target 最近的一组组合。 首先判断输入的数组是否有足够的数字提供组合,及num.length>=3。 同K sum 问题现将数组排序,同样固定一个数字,使用双指针去找另两个。定义两个变量,closet 和 re。 closet 用于更新现在离target最近的距离,re用于保存发现的最短距离target的sum值。 首先给closet赋最大值,然后每次发现 sum - target的绝对值小于closet, 更新closet,记录 sum。时间:20 ms 90.40%

class Solution {
    static int closet ;
    static int re;
    public int threeSumClosest(int[] nums, int target) {
        if(nums.length <3||nums == null){return 0;}
        Arrays.sort(nums);
        int len = nums.length;
        re= 0;
        closet = Integer.MAX_VALUE;
        for(int i=0;i<len-2;i++){
            find(nums,i+1,len-1,nums[i],target);
        }
        return re;
    }
    public void find(int[] num, int l,int r,int cur,int target){
        while(l<r){
            int sum = num[l] + num[r] +cur;
            if(Math.abs(sum-target)<closet){
                closet = Math.abs(sum-target);
                re = sum;
            }
            if(sum < target){
                l++;
            }
            else{r--;}
        } 
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值