每日一题算法:2020年6月24日 最接近的三数之和 threeSumClosest

2020年6月24日 最接近的三数之和 threeSumClosest

在这里插入图片描述

默认格式:

class Solution {
   
    public int threeSumClosest(int[] nums, int target) {
   
    }
}

解题思路:

看完题目觉得题目描述的不够详细,比如这三个数存在重复吗?同一个数字能重复使用吗?先对这几种情况进行测试,完善一下题目的设定
在这里插入图片描述
在这里插入图片描述
可以看出,数字允许重复,但是不允许重复使用同一个数字,也就是说,数组中出现几次就能使用几次该数字。

解题思路:

暴力算法,直接三重for循环,没有什么解决不了的问题。

这个肯定可以实现的,但是时间上肯定是不够的所以就不写代码了。

在暴力算法上进行优化。

首先看一下是否存在迭代的条件,也就是是否存在如果某值存在则另外的某值必定无效的情况。

想到了一种想法,但是还没有证实可行性。

想法是这样的,取出前3个数字求和并且排序,得到最大值a,中间值b,最小值c3个标志,并且记下和target的差距,然后读取下一个x,计算x和abc的大小关系,然后找出能够代替的那一个替换掉他,

target>a+b+x>a+b+c 此时x能够替代掉c并且让结果更接近target

反例:

1,2,3,4,5,6,100 target=103

如果利用以上规则,2,3,4比1,2,3更接近103,而结果103是需要1+2+100来得到的,所以丢弃1的这个过程就决定了结果的错误。

遇到问题我们继续解决,我们能否通过排序的方式来控制我们的迭代操作不出现上面所说的问题。我的解决方案是,先对数组进行排序,然后从头和尾开始向内部迭代。

做不出,写出来的有一些情况没法处理.

public int threeSumClosest(int[] nums, int target) {
   

        //先用冒泡排序整理数组
        maopao(nums);

        int len=nums.length;

        //返回值
        int res=300000;

        //三个值的坐标
        int start=0,middle,end=len-1;
        //如果头尾之和大于target,说明需要加上一个值使三个数的和最小,就是下标为1的值
        if (nums[0]+nums[len-1]>target){
   
            middle=1;
        }
        //否则就从尾部取出最大的值
        else {
   
            middle=len-2;
        }


        //头尾相接时结束循环
        while (middle!=start&&middle!=end)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值