题目来源:

https://leetcode.com/problems/3sum-closest/


题意分析:

这道题目输入一个数组nums和一个数target,找出数组中三个数,使得他们的和最接近target,返回这三个数的和。


题目思路:

这道题目和上一题3Sum很像,所以也可以用类似的方法去解决这个问题。整个过程分成两步:

①数组排序;这步时间复杂度是(O(nlogn))。

②固定一个数,这步的时间复杂度是(O(n))。

③在剩下的数里面通过“夹逼定理”,找出两个数,使得三个数的和最接近target。这步时间复杂度是(O(n))

总的时间复杂度为(O(nlogn) + O(n)*O(n)) = (O(n^2))。

优化:在第三步的时候通过判断剩下的数中是否最小的两个数相加就大于或者最大两个数就小于target - 第一个数,如果是,则直接判断最小(大)两个数和②中的那个数的和是不是最接近的值。


代码(python):

 1 class Solution(object):
 2     def threeSumClosest(self, nums, target):
 3         """
 4         :type nums: List[int]
 5         :type target: int
 6         :rtype: int
 7         """
 8         size = len(nums)
 9         if size < 3:
10             return 0
11         nums.sort()
12         i = 0 # fix the first index
13         ans = nums[0] + nums[1] + nums[size - 1] # ans is used to record the solution
14         while i < size - 2:
15             tmp = target - nums[i]
16             j = i + 1
17             k = size - 1
18             while j < k:
19                 if nums[j] + nums[k] == tmp:
20                     return target
21                 if nums[j] + nums[k] > tmp:
22                     if nums[j] + nums[j + 1] >= tmp:
23                         if nums[j] + nums[j + 1] - tmp < abs(ans - target):
24                             ans = nums[i] + nums[j] + nums[j + 1]
25                         break
26                     tmpans = nums[i] + nums[j] + nums[k]
27                     if tmpans - target < abs(ans - target):
28                         ans = tmpans
29                     k -= 1
30                 else:
31                     if nums[k] + nums[k - 1] <= tmp:
32                         if tmp - nums[k] -nums[k - 1] < abs(ans - target):
33                             ans = nums[i] + nums[k - 1] + nums[k]
34                         break
35                     tmpans = nums[i] + nums[j] + nums[k]
36                     if target - tmpans < abs(ans - target):
37                         ans = tmpans
38                     j += 1
39             i += 1
40             if ans == target:
41                 return target
42         return ans

View Code


转载请注明出处:http://www.cnblogs.com/chruny/p/4830175.html

转载于:https://www.cnblogs.com/chruny/p/4830175.html

[LeetCode]题解(python):016-3Sum Closest相关推荐

  1. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用

    上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...

  2. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  3. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)

    作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...

  4. 字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)

    28. 实现 strStr() strStr(haystack: str, needle: str) 的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现 ...

  5. 队列的基础概念与经典题目(Leetcode题解-Python语言)

    队列是先入先出(后入后出)的数据结构,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以. 普通队列 ...

  6. 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)

    在一维数组中的考察中,最常见的就是找出数组中的重复数.只出现一次的数或者丢失(消失)数等等. 一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可 ...

  7. 栈的基础概念与经典题目(Leetcode题解-Python语言)

    栈是先入后出(后入先出)的数据结构,常用操作就 push 和 pop,Python中用列表实现即可,基本概念可以看Leetbook相关章节. 普通栈 232. 用栈实现队列 class MyQueue ...

  8. 一般动态规划问题合集(Leetcode题解-Python语言)

    118. 杨辉三角 class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i ...

  9. 买卖股票类问题动态规划解法(Leetcode题解-Python语言)

    在 Leetcode 中,关于买卖股票的问题共有6道,而这些题目是可以用相同的思维进行求解的,强烈推荐这篇总结,写得非常到位. 股票类问题的动态规划分三步走,1.首先明确方程的含义, T[i][k][ ...

  10. 爬楼梯与路径类题目记忆化递归与动态规划双解法(Leetcode题解-Python语言)

    70. 爬楼梯(剑指 Offer 10- II. 青蛙跳台阶问题) 递归(英语:Recursion),是指在函数的定义中使用函数自身的方法.有意义的递归通常会把问题分解成规模缩小的同类子问题,当子问题 ...

最新文章

  1. 欢迎使用人体运动检测与跟踪CSDN-markdown编辑器
  2. 从复旦博士生到985高校副教授,贫穷使人深知摆脱自卑的艰难
  3. 帮Facebook把用户做到7亿的那个人,告诉你如何实现用户增长
  4. 【转】胶片曝光时的排版!!!!!!!
  5. NB-IOT使用小结
  6. 热点热词 新闻热点 最新新闻数据API接口-天狗热点热词开放平台
  7. Android 实现书籍翻页效果
  8. c#2.0 IEnumberable接口
  9. tp3.2 URL生成
  10. matlab 最速下降,matlab最速下降法
  11. tftpd64-SE使用
  12. DWG 、DXF格式互转、CAD版本转换,记住一个就能快速提高你的工作效率!
  13. java实验作业:银行账户
  14. Emacs-hacking第三天
  15. Docker入门实战看这篇就够了(最新详细以及踩过的坑)
  16. 好看可乐的韩剧综艺-推荐两部
  17. 超赞的卡尔曼滤波详解文章
  18. 2d游戏设计,pygame 游戏开发
  19. SQL Server查看库、表占用空间大小
  20. wpf 关于程序集间使用资源字典共享资源

热门文章

  1. std::string与output-operator的兼容问题
  2. 一个关于mahout0.5放置位置的错误,,,
  3. Entity Framework 4.1 CodeFirst实例
  4. silverlight DataPager控件
  5. [导入]Nebula3学习笔记(6): IO实战, ZIP解压缩程序
  6. Oracle 新建用户、赋予权限
  7. vue-resource HTTP API基础
  8. matlab学习笔记(4)
  9. (第十一周)规格说明书练习作业——吉林市一日游
  10. jQuery javaScript js 判断浏览器的类型、版本的方法