LeetCoe 016 3Sum Closest

本文探讨了一个算法问题:在给定的整数数组中,寻找三个数的和最接近给定目标值的方法。通过排序和双指针技巧,实现了一个高效的解决方案。

3Sum Closest

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

题目分析

这个题目很像015,区别在于这个题目的target不是零而是给出的一个数,同时可以不等于这个target,需要我们找出三个数相加最接近这个target的和。只需要返回一个int型的数就好。

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int sum = -99999;//相加和
        int diff = 9999;//每次计算时的差距
        int diff1 = 9999;//最小的差距值(唯一标志)
        if (nums == null || nums.length < 3) {
            return sum;
        }
        Arrays.sort(nums);

        for (int i = 0; i < nums.length - 2; i++) {
            //check for duplicate
            if (i > 0 && nums[i] == nums[i-1]) continue;

            //set params
            int results = nums[i];
            int lb = i + 1;
            int ub = nums.length - 1;
            while (lb < ub) {
                int compliment = nums[lb] + nums[ub] + results;
                diff = Math.abs(compliment - target);
                if(diff == 0){
                //若是等于target,则是最接近的,直接返回这个值就好
                    return compliment;
                }

                else {
                    if(diff1>diff){
                    //若是距离目标变小了,则更新最小的距离和对应的相加和
                        diff1 = diff;
                        sum = compliment;
                    }

                    //这里很像上一题,但是区别是上一题target是0,若是找到一个符合的,至少改动两个元素的坐标
                    //而这里求的是最接近的,故而每次都改动一个值来进行遍历
                    if(compliment > target)ub--;//若是大于目标,则减小最大数的值
                    else lb++;//若是小于目标,则增大最小数的值

                }      
            }
        }
        return sum;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值