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

难度:中等

目录

一、问题描述

二、解题思想

三、解题

1、判断极端情况

2、代码实现


一、问题描述

这里直接采用的是leetcode上面的问题描述。

        给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

下面给出示例:

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

 

二、解题思想

这一题和LeetCode的15题三数之和非常相似,有兴趣的可以看一看上一题的题解。15.三数之和-LeetCodeicon-default.png?t=M0H8https://blog.csdn.net/XUELEIQIANQIU/article/details/122522304?spm=1001.2014.3001.5501        个人认为,上一题的难度要比这一题简单,上一题还要判断重复的解的情况,这题则没有。思想上大致是相似的,使用的是双指针+排序的方法来解题的。

这里将指针移动的条件改为了:(sum为当前三数之和)

  • sum > target,尾指针--
  • sum <= target, 头指针++

        这里求得是距离最近得三数之和,我们需要将 sumtarget 得距离与上次求得 ans 和 target得距离进行比较,如果 sum target 得距离小于 anstarget 得距离 则更新答案 ans

三、解题

1、判断极端情况

        这里没有什么极端情况,注意指针不要越界就好了。

2、代码实现

    int distance(int i, int j){
        return max(i,j)-min(i,j);
    }
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        //初始化答案 为排过序的前三个元素的和
        int ans = nums[0] + nums[1] + nums[2];
        for(int i = 0; i < nums.size()-2; i++){
            int headPointer = i + 1;
            int tailPointer = nums.size() - 1;
            while(headPointer != tailPointer){
                int sum = nums[i] + nums[headPointer] + nums[tailPointer];
                if(distance(sum,target) < distance(target,ans)){
                    ans = sum;
                }else if(sum > target){
                    tailPointer--;
                }
                else if(sum <= target){
                    headPointer++;   
                }             
            }
        }
        return ans;
    }

  以上就是对于本题,我查看资料以及自己思考所编写出来得题解,如果有更好的方法,欢迎大家在下方留言,一起讨论。👇👇 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Alkaid_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值