16. 最接近的三数之和

2019-12-23  本文已影响0人  间歇性发呆

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

先选中一个元素,剩余的数组使用前后指针 O(n^2)

class Solution {
    /**
     * 先选中一个元素,剩余的数组使用前后指针
     *
     * @param nums
     * @param target
     * @return
     */
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int min = nums[0] + nums[1] + nums[2];
        for (int i = 0; i < nums.length - 2; i++) {
            int begin = i + 1, end = nums.length - 1;
            while (begin < end) {
                int tmp = nums[begin] + nums[end] + nums[i];
                if (tmp == target) {
                    return target;
                }
                if (tmp < target) {
                    begin++;
                    // 减少不必要的循环
//                    while (begin < end - 1 && nums[begin] == nums[begin + 1]) {
//                        begin++;
//                    }
                } else {
                    end--;
                    // 减少不必要的循环
//                    while (begin < end - 1 && nums[end] == nums[end - 1]) {
//                        end--;
//                    }
                }
                if (Math.abs(target - tmp) < Math.abs(target - min)) {
                    min = tmp;
                }
            }
            // 减少不必要的循环
//            while (i < nums.length - 2 && nums[i] == nums[i + 1]) {
//                i ++;
//            }
        }
        return min;
    }
}
运行效率
上一篇 下一篇

猜你喜欢

热点阅读