Leet Code 16.最接近的三数之和

给定一个包括n个整数的数组nums和一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。

思路

可以借鉴上题的循环方式,双指针法。每次判断三个数之和与target的绝对值是否最小,是最小则返回之和,否则继续遍历。如果三数和小于target,就可以将左指针后移,同理,如果三数和大于target,就可以将右指针前移。

提交代码

import java.util.*;
import static java.lang.Math.min;

public class leetcode {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String str = scan.nextLine();
        int[] nums = new int[n];
        for(int i = 0; i < n; i++) {
            nums[i] = scan.nextInt();
        }
        int target = scan.nextInt();
        int result= threeSumClosest(nums, target);
        System.out.println(result);
    }

    public static int threeSumClosest(int[] nums, int target) {
        int len = nums.length;
        Arrays.sort(nums);
        int ans = nums[0]+nums[1]+nums[2];
        for(int i = 0; i<len; i++) {
            int L = i+1;
            int R = len-1;
            while (L < R) {
                int sum = nums[i] + nums[L] + nums[R];
                if(Math.abs(ans-target) > Math.abs(sum-target)) {
                    ans = sum;
                }
                int diff = sum - target;
                if(diff == 0) {
                    return target;
                }
                else if (diff < 0) {
                    L++;
                }
                else if (diff > 0) {
                    R--;
                }
            }
        }
        return ans;
    }
}

小结

纠结了一会初始值为多少,题目应该是确定nums.length>=3的,所以初始值可以为nums[1]+nums[2]+nums[3]

原文地址:https://www.cnblogs.com/chenshaowei/p/12625095.html