leetcode_16. 最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

 

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
 

提示:

3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#暴力超时
class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n=len(nums)
        ans=10**8
        total=0
        for i in range(n):
            for j in range(i+1,n):
                for k in range(j+1,n):
                    total=nums[i]+nums[j]+nums[k]
                    if abs(total-target)<abs(ans-target):
                        ans=total
        return ans
#排序 双指针 O(n^2)
class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        n=len(nums)
        ans=10**8
        for i in range(n):
            p1=i+1
            p2=n-1
            while(p1<p2):
                s=nums[i]+nums[p1]+nums[p2]
                if abs(s-target)<abs(ans-target):
                    ans=s
                if s==target:
                    return target
                if s>target:
                    p2-=1
                else:
                    p1+=1

        return ans
class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        n=len(nums)
        ans=10**8
        for i in range(n):
            #保证下次从不同的数开始
            if (i>0 and nums[i]==nums[i-1]):
                continue
            p1=i+1
            p2=n-1
            while(p1<p2):
                s=nums[i]+nums[p1]+nums[p2]
                if s==target:
                    return target
                if abs(s-target)<abs(ans-target):
                    ans=s
                if s>target:
                    # 得到不同的值
                    while(p2>p1 and nums[p2]==nums[p2-1]):
                        p2-=1
                    p2-=1
                else:
                    while(p1<p2 and nums[p1+1]==nums[p1]):
                        p1+=1
                    p1+=1

        return ans
posted @ 2020-12-09 15:44  hqzxwm  阅读(57)  评论(0编辑  收藏  举报