16. 最接近的三数之和

  1. 最接近的三数之和
    最接近的三数之和
    1.回溯算法
package LeetCode;

import java.util.*;

class Solution {
    int res = 0;
    int chazhi = Integer.MAX_VALUE;
    ArrayList<Integer> list = new ArrayList<>();   //临时的容器

    public int threeSumClosest(int[] nums, int target) {
        helper(nums,target,0);
        return res;
    }

    private void helper(int[] nums, int target, int start){
        if (list.size()==3){
            int sum=0;
            Iterator<Integer>iterator=list.iterator();
            while (iterator.hasNext()){
                sum+=iterator.next();
            }
            int tmpChazhi=Math.abs(sum-target);
            if (tmpChazhi<chazhi){
                chazhi=tmpChazhi;
                res=sum;
            }
            return;
        }
        for (int i = start; i < nums.length ; i++) {
              list.add(nums[i]);
              helper(nums,target,i+1);
              list.remove(list.size()-1);
        }
    }
}

2.双指针算法

package LeetCode;

import java.lang.reflect.Array;
import java.util.Arrays;

class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[]nums={-1,2,1,-4};
        int target=2;
        int result=s.threeSumClosest(nums,2);
        System.out.println(result);

    }
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
          int res=0;
          int diff=Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {   //{a,b,c,d,e}   c 为num.length-3的位置
                                                  // 0 0+1
             int start=i+1;
             int end=nums.length-1;
           while (start<end){
               int sum=nums[i]+nums[start]+nums[end];
               if (sum<target){
                   start++;
               }else if(sum==target){
                   return  target;
               }else {
                   end--;
               }
               int tempDiff=Math.abs(sum-target);
               if(tempDiff<diff){
                   diff=tempDiff;
                   res=sum;
               }
           }
        }
        return  res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值