LeetCode 之 3Sum Closest

题目链接:3Sum Closest

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

For example, given array S = {-1 2 1 -4}, and target = 1.

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

题意:给定数组中,找到和target最近的3个数字的和。

解题:这道题比3Sum要简单,主要是在于无需在意重复部分,所以可以设置一个min值,通过循环遍历比较min和 |sum-target|(绝对值),得到最后的结果。

代码实现:

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int len = nums.length;
        if(len<3)
            return -1;

        int re = nums[0]+nums[1]+nums[2];
        int min = Math.abs(re - target);

        //最普通的三重循环遍历
        for(int i = 0;i<len-2;i++){
            for(int j = i+1;j<len-1;j++){
                for(int k = j+1;k<len;k++){
                    int sum = nums[i] + nums[j] + nums[k];
                    int temp = Math.abs(sum - target);
                    //当存在temp<min时,记录sum的值,改变min
                    if(temp < min ){
                        re = sum;
                        min = temp;
                    }   
                }
            }

        }

        return re;
    }
}

上述代码实现的时间复杂度为O(n^3),根据解决3Sum的指针的思路,同样可以降低时间复杂度到O(n^2)。

代码实现如下:

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int len = nums.length;
        if(len<3)
            return -1;

        //同样要首先新对数组进行排序
        Arrays.sort(nums);

        int re = nums[0]+nums[1]+nums[2];
        int min = Math.abs(re - target);
        int j = 0, k = 0;

        for(int i = 0; i<len-2;i++){
            j = i+1;
            k = len-1;
            while(j < k){
                int sum = nums[i] + nums[j] + nums[k];
                int temp = Math.abs(sum - target);
                //如果temp==0了,即sum==target,直接返回sum即可,无需继续进行
                if(temp == 0){
                    return sum;
                }
                if(temp < min){
                    re = sum;
                    min = temp;
                }

                if(sum > target){
                    k--;
                }else
                    j++;

            }
        }

        return re;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值