zoukankan      html  css  js  c++  java
  • 3Sum Closest

    For example, given array S = {-1 2 1 -4}, and target = 1.
    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

     想来想去想不到什么好的解决方法,只好用最原始的方法,把所有可能的组合列举一遍,选择最优的,O(n^3)。

    可以在这个方法上做些优化。 

    class Solution:
        def fabs(self,a):
            if a<0:
                return -a
            else:
                return a
    
        def threeSumClosest(self, num, target):
            num_items=len(num)
            if num_items==3:
                return sum(num)
            num.sort()
    
            absdiff=self.fabs(target)+self.fabs(num[num_items-1])+self.fabs(num[num_items-2])+self.fabs(num[num_items-3])
            output=absdiff
    
            for i in range(num_items-2):
                for j in range(i+1,num_items-1):
                    sum2=num[i]+num[j]
                    k=self.findClosest(num[j+1:num_items],target-sum2,num_items-j-1)
                    if target==sum2+k:
                        return sum2+k
                    else:
                        absd=self.fabs( target- (sum2+k) )
                        if absd<=absdiff:
                            absdiff=absd
                            output=sum2+k
            return int(output)
    
        def findClosest(self,num,target,num_items):
            #num is sorted
            if target>=num[num_items-1]:
                return num[num_items-1]
            if target<=num[0]:
                return num[0]
            head=0
            end=num_items-1
            mid=(head+end)//2
            while (end-head)>1:
                if target>=num[mid]:
                    head=mid
                    mid=(head+end)//2
                else:
                    end=mid
                    mid=(head+end)//2
            if self.fabs(num[end]-target)-self.fabs(num[head]-target)>0:
                return num[head]
            else:
                return num[end]
    
    
    if __name__ == '__main__':
        s=Solution()
        n=[1,2,3,4,5,6]    
            print(s.threeSumClosest(n,0))
        print(s.threeSumClosest([1,1,1,1], -100))
  • 相关阅读:
    POJ 3468 区间更新,区间求和(经典)
    HDU 1698 区间更新
    POJ 2828 单点更新(好题)
    HDU 2795 单点更新,区间优先查找(想法)
    HDU 1394 树状数组求逆序对
    HDU 1754 单点更新,求区间最大值
    Servlet 3.0 对异步处理的支持
    Servet3.0于Servlet2.5比较
    你的灯还亮着吗读书笔记3
    你的灯还亮着吗读书笔记2
  • 原文地址:https://www.cnblogs.com/iois/p/4021528.html
Copyright © 2011-2022 走看看