zoukankan      html  css  js  c++  java
  • [LeetCode]题解(python):016-3Sum Closest

    题目来源:

    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

  • 相关阅读:
    OpenWRT Mac 虚拟机PD 分享 for 软路由
    How to write u disk from img in mac os x
    linux find file > 100 M
    gojs for data flow
    正则表达式
    grep
    搜索引擎Query Rewrite
    Kafka replication
    cassandra写数据CommitLog
    Solr DIH JDBC 源码解析
  • 原文地址:https://www.cnblogs.com/chruny/p/4830175.html
Copyright © 2011-2022 走看看