最接近三数之和

104 阅读1分钟

题目

三重循环 + 双指针

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        int [] nums = new int[] {-1, 2, 1, -4};
        main.threeSumClosest(nums, 1);
    }


    public int threeSumClosest(int[] nums, int target) {
        int length = nums.length;
        // 对数组排序
        Arrays.sort(nums);
        
        int ans = 0;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < length; i ++) {
            int j = i + 1;
            int k = length - 1;
            while (k > j) {
                if (Math.abs(nums[i] + nums[j] + nums[k] - target) < min) {
                    min = Math.abs(nums[i] + nums[j] + nums[k] - target);
                    ans = nums[i] + nums[j] + nums[k];
                }
                if (nums[i] + nums[j] + nums[k] > target) {
                    // 移动右指针, 缩小三数之和
                    k --;
                } else if (nums[i] + nums[j] + nums[k] < target) {
                    // 移动左指针, 增大三数之和
                    j ++;
                } else if (nums[i] + nums[j] + nums[k] == target) {
                    return target;
                }
            }

        }
        return ans;
    }

}

基本思路

  1. 对数组排序, 使得循环可以优化

  2. 当i确定时, j, k的指针指向剩余数组的两端, 当nums[i] + nums[j] + nums[k] > target的时候, 缩小k, 减少三数之和, 反之增大j.

  3. 遇见三数之和 == target的时候, 可以直接返回