LeetCode:最接近的三数之和

旧城冷巷雨未停 提交于 2020-03-17 10:03:06

刷题神器:LeetCode官方网站

一、题目还原

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

二、解题思路

①三数之和的思路和上一题一样

Solution 2 双指针
① EdgeCase:数组长度小于3或者等于三但是相加不等于0的,返回空
② 将数组进行排序
③ 定义左右两个下标,记为left = 0和right = nums.length - 1
④ 以第一个数num为基准,left和right分别从第二个数和最后一个数开始计算,如果num+nums[left]+nums[right] == 0则left ++; right --;注意,如果left的下一个与之前数字相同继续left++,right同理
⑤ 注意每次循环的基准数如果和上一次相同直接跳过进行下一次循环

② 定义一个diff表示三数之和与target的差,如果差越小,就取当前的和

三、代码展示

① main函数

 public static void main(String[] args) {
    int[] nums = {1,2,5,10,11};
    int target = 12;
    System.out.println(threeSumClosest(nums,target));
}

② threeSumClosest方法函数

public static int threeSumClosest(int[] nums, int target) {
    if(nums.length < 3 ){
        return 0;
    }

    Arrays.sort(nums);
    int index = 0;
    int diff = Integer.MAX_VALUE;
    int result = 0;
    for(int num : nums){
        int left = index + 1;
        int right = nums.length - 1;
        if(index > 0 && num == nums[index-1]){
            index ++;
            continue;
        }
        while(left <  right){
            int sum = num + nums[left] + nums[right];
            if(sum == target){
                return sum;
            }else if(sum < target){
                left ++;
            }else{
                right --;
            }
            diff = Math.min(Math.abs(sum - target),diff);
            result = Math.abs(sum - target) <= diff ? sum : result;

        }
        index ++;
    }

    return result;
}

控制台输出:

13

Process finished with exit code 0

四、自我总结

LeetCode第十六题,难度为中等,不过思路和上一题没有太大的区别,博主选择了双指针方法。
Q16提交记录

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!