美文网首页算法提高之LeetCode刷题数据结构和算法分析
Leetcode之16-最接近的三数之和(3Sum Closes

Leetcode之16-最接近的三数之和(3Sum Closes

作者: 北京程序猿 | 来源:发表于2019-04-22 22:24 被阅读2次

前言

个人网站

公众号: 北京程序猿, 网站 : https://yaml.vip

算法题

题干

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

解法

本题同样比较简单, 第一步就是排序, 排序后采用双指针才更方便向中间靠拢。与三数之和思路一样, 唯一的区别是本道算法题需要两个变量用来存储差与和。

Java代码

public int threeSumClosest(int[] nums, int target) {
    Arrays.sort(nums);
    int minDiff = Integer.MAX_VALUE, data = 0;
    final int LEN = nums.length;
    for (int i = 0; i < LEN - 2; i++) {
        int left = i + 1, right = LEN - 1;
        while(left < right) {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == target) {
                return target;
            }
            if (Math.abs(sum - target) < minDiff) {
                minDiff = Math.abs(sum - target);
                data = sum;
            }
            if (sum > target) {
                right--;
            } else {
                left++;
            }
        }
    }
    return data;
}

代码解析

  1. 第3行代码中变量minDiff表示最小差值, data表示三数之和。
  2. 第5行代码for循环中i<LEN-2表示外层循环到倒数第三个数即可, 毕竟题目找三数之和。
  3. 第7行代码while循环表示双指针left和right向中间靠拢。
  4. 剩余代码表示如果和sum恰好等于三数之和即直接返回, 然后判断差值, 最后再确定是向右向左靠拢。

本文著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

作者:北京程序猿

链接:最接近的三数之和

相关文章

网友评论

    本文标题:Leetcode之16-最接近的三数之和(3Sum Closes

    本文链接:https://www.haomeiwen.com/subject/byspgqtx.html