[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):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
转载请注明出处:http://www.cnblogs.com/chruny/p/4830175.html