• 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
    
  • 相关阅读:
    Symfony2 多bundle及实体获取,app_dev及app下调试
    Symfony2 WebService(一) 配置篇
    Symfony2 数据调用常用方法
    Symfony2 配置自己的log日志、使用配置文件定义全局常量
    Symfony2 环境及基本命令
    Asterisk拨号函数Dial()详解
    C语言系统资源控制(getrlimit && setrlimit)
    centos FTP服务器的架设和配置
    MYSQL远程登录权限设置
    SIP keepalive方法
  • 原文地址:https://www.cnblogs.com/hqzxwm/p/14109014.html
Copyright © 2020-2023  润新知