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

  • 相关阅读:
    莫名其妙的float:left; 不能使元素紧贴父级的坑
    将HTML元素转换成图片供用户下载(html2canvas + canvas2Image)
    使用Git代替FTP进行虚拟主机的代码管理
    jQuery: on()特别的几种用法
    监控页面后退前进,浏览器文档加载事件之pageshow、pagehide
    博客园Markdown编辑器试玩~~~
    移动端调试神器(eruda)
    移动端分享插件使用总结
    sqlloader的使用------windows版
    运维工作总结教训
  • 原文地址:https://www.cnblogs.com/chruny/p/4830175.html
Copyright © 2011-2022 走看看