zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Spring.Net框架与WCF的集成(上)
    重入与回调并发(Reentrant & CallbackConcurrency )
    WCF中的异步实现
    WCF开发时如何选择正确的实例模式(InstanceMode)?
    WCF实例与并发
    WCF消息可靠性与有序传递
    WCF实际应用之IParameterInspector扩展
    WCF中几个基本知识点整理
    HTTP与Tcp协议下双工通信的差异
    细说WCF中的会话模式
  • 原文地址:https://www.cnblogs.com/hqzxwm/p/14109014.html
Copyright © 2011-2022 走看看