美文网首页
最接近的三数之和

最接近的三数之和

作者: xialu | 来源:发表于2021-10-13 22:21 被阅读0次

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest

题目描述:

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

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

思路一:

暴力遍历:

  • 出事化三个指针,将数组nums所有3个数组合的和与target进行比较,的到最接近的值(不可能有比相等更接近的值,因此如果三数和等于target也可以直接返回).
代码实现:
class Solution {
    public int minNum;
    public int result;
    public int threeSumClosest(int[] nums, int target) {
        int len = nums.length;
        int sum = nums[0] + nums[1] + nums[2];
        // 初始化最小值.
        minNum = Math.abs(sum - target);
        result = sum;
        for (int i = 0; i < len; i++) {
            // 重复元素跳过.
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int left = i + 1;
            int right = len - 1;
            while (left < right) {
                while (left < right) {
                    if (minNum == 0) return sum;
                    sum = nums[i] + nums[left] + nums[right];
                    int abs = Math.abs(sum - target);
                    if (abs <= minNum) {
                        minNum = abs;
                        result = sum;
                    }  
                    right--;
                }
                left++;
                right = len - 1;
            }
        }
        return result;
    }
}
思路二:
  • 对数组进行排序,保证数组从左往右单调递增.
  • 初始化三个指针,i从0开始遍历,left = i + 1,right = nums.length - 1;
  • 计算三数和sum,如果sum == target,直接返回
  • sum > target,则right--,因为数组单调递增,左移right指针可以使三数和sum减小
  • sum < target, 则left++,因为数组单调递增,右移left指针可以使三数和sum增加
代码实现:
class Solution {
    public int minNum;
    public int result;
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int len = nums.length;
        int sum = nums[0] + nums[1] + nums[2];
        // 初始化最小值.
        minNum = Math.abs(sum - target);
        result = sum;
        for (int i = 0; i < len; i++) {
            // 重复元素跳过.
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int left = i + 1;
            int right = len - 1;
           
            while (left < right) {
                sum = nums[i] + nums[left] + nums[right];
                int abs = Math.abs(sum - target);
                if (abs <= minNum) {
                    minNum = abs;
                    result = sum;
                }
                // 三数和等于target,直接返回
                if (sum == target) return result;
                // 三数和小于tagrget,增加left(因为数组从左到右递增)
                if (sum < target) left++;
                // 三数和大于tagrget,减小right(因为数组从左到右递增)
                else right--;
            }
        }
        return result;
    }
}

相关文章

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • LeetCode-16 最接近的三数之和

    题目:16. 最接近的三数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第16题最接近的三数之和,这...

  • 双指针总结

    左右指针 主要解决数组中的问题:如二分查找 盛最多水的容器 三数之和 四数之和 最接近三数之和 快慢指针 主要解决...

  • LeetCode练习day1-数组相关

    LeetCode16 最接近的三数之和 相似题目:LeetCode15 三数之和 题目详情 给你一个长度为 n 的...

  • 最接近的三数之和

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum...

  • 最接近的三数之和

    题目 思路 题解

  • 最接近的三数之和

    题目地址 1.思路 第一步很容易想到的就是降维处理,三个数相当于三维,那么我确定一个数的时候只剩下2维,这样就把问...

  • 最接近的三数之和

    leetcode 16 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中...

  • 最接近的三数之和

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum-c...

  • 双指针法(算法)

    案例: 盛最多水的容器、三数之和、最接近的三数之和 双指针法一般对应于有序数组的情况,通过调节指针(左右移动),...

网友评论

      本文标题:最接近的三数之和

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