栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

16. 最接近的三数之和 java Java 中Pair的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

16. 最接近的三数之和 java Java 中Pair的使用

Pair (JavaFX 8)

javafx.util 包中的Pair类

但是LeetCode不能用Pair类,这里只是简单提一下有这个类而已。

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

示例:

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

双指针算法

        第一层for循环是 i ,j、k为双指针。

        当 j 确定的时候,找一个最小的 k ,使得。

         这样,就可以枚举出所有大于等于 target 的情况。然后看看当前和,是否最接近。如果是,就更新一下结果。

因为要找的是最接近的和,这个最接近有2层含义,大于等于 target 的最小数,或者是 小于等于 target 的最大数。

所以,如果存在

大于等于 target的最小和
小于等于 target的最大和

我们都要去检查一下,看看谁才是最接近的和。

数组的单调性。

如果不与 j 重叠,且最接近 j 的 k 满足

nums[i] + nums[j] + nums[k] >= target

并且 k - 1不与 j 重叠(k - 1 > j),则存在 k - 1 满足

nums[i] + nums[j] + nums[k - 1] < target

就要去检测一下 nums[i] + nums[j] + nums[k - 1] 这个和 ,是不是最接近的和。

 破解版
import java.util.Arrays;

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        //使用双指针算法,需要单调性,所以给数组进行排序。
        Arrays.sort(nums);
        //Pair存的是一对值(一对 value)。
        //<当前和与target的差值的绝对值,当前和>
//        Pair res = new Pair<>(Integer.MAX_VALUE, Integer.MAX_VALUE);
        //[0]:当前和与target的差值的绝对值   [1]:最接近的和
        int[] res = new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE};
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1, k = nums.length -1; j < k; j++) {
                
                //情况一:大于等于 target的最小和
                while (k - 1 > j && nums[i] + nums[j] + nums[k - 1] >= target)
                    k--;
                int s = nums[i] + nums[j] + nums[k];
                int dif = Math.abs(s - target);
                //如果差值更小,说明当前和更接近 target,更新 res
                //利用差值来判断接近程度
                if(dif <= res[0]){
//                    res = new Pair<>(dif, s);
                    res[0] = dif;
                    res[1] = s;
                }
                
                //情况二:小于等于 target的最大和
                if (k - 1 > j){
                    s = nums[i] + nums[j] + nums[k - 1];
                    dif = Math.abs(s - target);
                    if(dif <= res[0]){
//                        res = new Pair<>(dif, s);
                        res[0] = dif;
                        res[1] = s;
                    }
                }
            }
        }
        return res[1];
    }
}

纯净版
import java.util.Arrays;

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int[] res = new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE};
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1, k = nums.length -1; j < k; j++) {
                while (k - 1 > j && nums[i] + nums[j] + nums[k - 1] >= target)
                    k--;
                int s = nums[i] + nums[j] + nums[k];
                int dif = Math.abs(s - target);
                if(dif <= res[0]){
                    res[0] = dif;
                    res[1] = s;
                }
                if (k - 1 > j){
                    s = nums[i] + nums[j] + nums[k - 1];
                    dif = Math.abs(s - target);
                    if(dif <= res[0]){
                        res[0] = dif;
                        res[1] = s;
                    }
                }
            }
        }
        return res[1];
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号