每日算法系列【LeetCode 16】最接近的三数之和

题目描述

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

示例1

        输入:
nums = [-1,2,1,-4], target = 1.
输出:
2
解释:
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
      

题解

最暴力的方法就是直接枚举三个不同的数,然后求出差值最小的和,但是这样时间复杂度是 ,太高了。

那么我们先枚举一个数试试,并且假设它是最小的数,然后寻找比它大的两个数就行了,这就需要我们先对数组进行排序(假设排序后数组是 a )。

如果枚举的数是 ,那么我们只需要寻找和 差值最小的两个数之和就行了。

如果用双指针的方法,初始时令 ,同时 。那么如果 ,就说明 r 太大了,需要左移。否则的话如果 ,就说明 l 太小了,需要右移。在不断移动的过程中更新最小差值就行了,因为 lr 最终一共只移动了 O(n) 步,所以总的时间复杂度只有 ,忽略低阶项之后只有 ,还是可以接受的。

代码

c++

        class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int n = nums.size(), res = 10000000;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < n - 2; ++i) {
            int l = i + 1, r = n - 1;
            while (l < r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum == target) return sum;
                if (abs(sum-target) < abs(res-target)) res = sum;
                if (sum > target) r--;
                else l++;
            }
        }
        return res;
    }
};

      

python

        class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n, res = len(nums), 10000000
        nums.sort()
        for i in range(n-2):
            l, r = i+1, n-1
            while l < r:
                s = nums[i] + nums[l] + nums[r]
                if s == target:
                    return s
                if abs(s-target) < abs(res-target):
                    res = s
                if s > target:
                    r -= 1
                else:
                    l += 1
        return res
      
算法码上来 文章被收录于专栏

公众号「算法码上来」。godweiyang带你学习算法,不管是编程算法,还是深度学习、自然语言处理算法都一网打尽,更有各种计算机新鲜知识和你分享。别急,算法码上来。

全部评论

相关推荐

点赞 评论 收藏
分享
Kurumis:整个简历看下来就发现你其实对测试理解还很浅,很多地方都是硬凑上去,项目也是学生课设级别,没什么含金量 首先是学习建议: 1.系统性了解一个真实工程的框架,有利于你后续提升项目含金量,理解测试的逻辑 2.真正去学一下自动化测试和性能测试 再就是简历本身包装问题: 1.投测试的话就不要说自己独立开发自己测,专注描述自己怎么做测试的 2.项目经历太像套话,很容易让人怀疑你到底真的做过没有,比如并发是具体做了多少并发?自动化脚本是怎么跑兼容性和性能测试的?测试用例写了多少条? 3.教务管理系统一听就是数据库课设作业,含金量不高,不过你可以在原项目基础上重构扩展,比如添加docker容器部署MySQL和Redis,添加消息队列和锁机制防止系统扛不住高并发访问,让它真的像个实际工程 4.技能里性能专项测试没有把握不要乱写,就写你会什么工具就行了,做专项性能测试的都是行业大佬,你要写的话一定要有对应的专项性能测试项目 5.可以在简历里附上项目链接,压缩简历内容的同时提升简历真实性
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务