题目:

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).

代码:

做过第15题:3Sum之后,看到该问题,不会很陌生,只不过这次目标值不在是0,而是尽可能接近一个传入的参数

同样先尝试了遍历3遍,也就是O(n^3)时间复杂度,不出所料,超时。

于是,根据上一题的经验,先确定第一个数字,之后在剩余数字中定义两端的两个指针,一个最大一个最小,根据三数相加和目标值比较的结果,分别移动左右两端的指针,增加或缩小三数的和,靠近目标值。

代码已经加入详细注释,根据之前的经验自己写的,调试了很久。还有很多不足,共同学习,望大神多多指教:

def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums) < 3: return 0
        #排序
        nums.sort()
        res = 0
        result = []
        flag = []
        length = len(nums)
        for i in range(0, length - 2):
            if i and nums[i] == nums[i - 1]:
                continue
            left, right = i + 1, length - 1
            while left < right:   
                #如果三数字相加结果等于目标值,直接返回结果
                if nums[i] + nums[left] + nums[right] == target:
                    #print(left,right, "equal ",nums[i], nums[left],  nums[right])
                    res = target
                    return res
                #如果三数字相加结果大于目标值,右边的数字指针减小
                elif nums[i] + nums[left] + nums[right] > target:
                    print(left,right, "big ",nums[i], nums[left],  nums[right])                      
                    res =  nums[i] + nums[left] + nums[right]
                    right -= 1
                    #如果指针指向的下一个数字和该数字相同,则指针继续向左移动
                    while left < right and nums[right]==nums[right+1]:
                        right -= 1
                    #由于存在移动一位之后三数字相加和突然小于目标值的情况,所以需要记录该值来比较
                    #否则下一轮循环之后的值和目标值得差可能比当前更大
                    if nums[i] + nums[left] + nums[right] < target:
                        result.append(res)
                        flag.append(abs(res-target))   
                #如果三数字相加结果小于目标值,左边的数字指针增加        
                else:
                    print("little ",nums[i], nums[left],  nums[right])                  
                    res =  nums[i] + nums[left] + nums[right]
                    left += 1
                    #如果指针指向的下一个数字和该数字相同,则指针继续向右移动
                    while left < right and nums[left]==nums[left-1]:
                        left += 1
                    #由于存在移动一位之后三数字相加和突然大于目标值的情况,所以需要记录该值来比较
                    #否则下一轮循环之后的值和目标值得差可能比当前更大
                    if nums[i] + nums[left] + nums[right] > target:
                        result.append(res)
                        flag.append(abs(res-target))   
            #result分别存储不同的第一个数字遍历后最接近目标值的结果
            #flag对应存储不同结果和目标值之间的差
            result.append(res)
            flag.append(abs(res-target))
        print (result,'\n',flag)
        #返回差距最小的结果即可    
        return (result[flag.index(min(flag))])

16. 3Sum Closest的更多相关文章

  1. [LeetCode][Python]16: 3Sum Closest

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 16: 3Sum Closesthttps://oj.leetcode.com ...

  2. LeetCode 15. 3Sum 16. 3Sum Closest 18. 4Sum

    n数求和,固定n-2个数,最后两个数在连续区间内一左一右根据当前求和与目标值比较移动,如果sum<target,移动较小数,否则,移动较大数 重复数处理: 使i为左至右第一个不重复数:while ...

  3. 《LeetBook》leetcode题解(16):3Sum Closest [M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  4. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

  5. LeetCode 16. 3Sum Closest(最接近的三数之和)

    LeetCode 16. 3Sum Closest(最接近的三数之和)

  6. Leetcode 16. 3Sum Closest(指针搜索)

    16. 3Sum Closest Medium 131696FavoriteShare Given an array nums of n integers and an integer target, ...

  7. 15. 3Sum、16. 3Sum Closest和18. 4Sum

    15 3sum Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = ...

  8. [LeetCode] 16. 3Sum Closest 最近三数之和

    Given an array nums of n integers and an integer target, find three integers in nums such that the s ...

  9. Leetcode 16. 3Sum Closest

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

随机推荐

  1. 动画的使用—View Animation

    View Animation定义了下面的四种动画效果: 缩放(scale).位移(translation).旋转(rotation).透明(alpha)   缩放动画: ScaleAnimation( ...

  2. 1128ORDER BY的原理

     工作过程中,各种业务需求在访问数据库的时候要求有order by排序.有时候不必要的或者不合理的排序操作很可能导致数据库系统崩溃.如何处理好order by排序呢?本文从原理以及优化层面介绍 ord ...

  3. django model Meta选项

    可用的 Meta 选项 abstract Options.abstract 如果 abstract = True ,这个 model 就是一个 抽象基类 . app_label Options.app ...

  4. Scrapy的中Css 选择器

    //通过 名为 video_part_lists 的Class 中下面的 li 标签 liList = response.css('.video_part_lists li') for li in l ...

  5. 线段树 poj 2991

    我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...

  6. JavaScript零基础学习系列一

    JavaScript Js分成三大块: ECMAScript:语言本身,是标准,js是它的一个具体实现 BOM:浏览器对象模型 DOM:文档对象模型 ECMAScript有三种具体实现: JavaSc ...

  7. java学习流程

    J2SE 面向对象-封装.继承.多态内存的分析递归集合类.泛型.自动打包与解包.Annotation IO 多线程.线程同步 TCP/UDP AWT.事件模型.匿名类 正则表达式反射机制 2:数据库( ...

  8. 使用Python进行描述性统计

    目录 1 描述性统计是什么?2 使用NumPy和SciPy进行数值分析 2.1 基本概念 2.2 中心位置(均值.中位数.众数) 2.3 发散程度(极差,方差.标准差.变异系数) 2.4 偏差程度(z ...

  9. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

  10. 【迁移】—Entity Framework实例详解 转

    一.Entity Framework 迁移命令(get-help EntityFramework) Enable-Migrations 启用迁移 Add-Migration 为挂起的Model变化添加 ...