LeetCode(2)最接近的三数之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37293461/article/details/84111631

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

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

这个题为了减少时间复杂度,最优雅的解法是双指针遍历,求最接近target的三数之和,最后返回。

上代码:

import java.util.Arrays;

/**
 * @author zhangyan
 * @date 2018/10/8 8:16
 */
public class ThreeSumClosest {

    public static int threeSumClosest(int[] num, int target) {

            int result = num[0] + num[1] + num[num.length - 1];    //初始三数之和result
            Arrays.sort(num);                                      //数组排序
            for (int i = 0; i < num.length - 2; i++) {
                int start = i + 1, end = num.length - 1;           //头指针,尾指针
                while (start < end) {
                    int sum = num[i] + num[start] + num[end];      //此时的三数之和为sum
                    if (sum > target) {
                        end--;                                     //尾指针后移
                    } else {
                        start++;                                   //头指针前移
                    }
                    if (Math.abs(sum - target) < Math.abs(result - target))   //取绝对值,比较大小
                    {
                        result = sum;                              //找到最接近target的三数之和
                    }
                }
            }
            return result;                                         //返回最接近的三数之和
        }


    public static void main(String[] args) {
        int[] num = new int[]{-1,2,1,-4};
        System.out.println(threeSumClosest(num,1));
    }

}

猜你喜欢

转载自blog.csdn.net/m0_37293461/article/details/84111631