3Sum

Description

Solution

O(N^2) (排除后做法)

class Solution:
    def twoSum(self,nums,start, target):
        end = len(nums)-1
       
        while start < end:
            if nums[start] + nums[end] > target:
                end-=1
            elif nums[start] + nums[end] < target:
                start+=1
            else:
                self.res.append([-target,nums[start],nums[end]])
                while start < end and  nums[start]==nums[start+1]: ####去重重要的方法
                    start+=1
                while start < end and  nums[end]==nums[end-1]:  ####去重重要的方法
                    end-=1  
                start+=1
                end -=1

    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        self.res=[]
        i=0
        for i in range(0,len(nums)-2): ####
            if i and nums[i-1] == nums[i]:  #### Important
                continue
            target = - nums[i]
            self.twoSum(nums,i+1,target)
        return self.res

如果不使用sort,纯粹dict做O(N^2):

class Solution:
    def twoSum(self,nums,target):
        for k in self.ndict.keys():
            if self.ndict[k] == 0:
                continue
            if target - k in self.ndict:
                if self.ndict[target - k] == 0:
                    continue
                if k == target -k:
                    if self.ndict[k]>=2:
                        min_v = min(min(-target,k),target-k)
                        max_v = max(max(-target,k),target-k)
                        self.res.add((min_v,max_v))
                else:
                    min_v = min(min(-target,k),target-k)
                    max_v = max(max(-target,k),target-k)
                    self.res.add((min_v,max_v))
           
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        self.ndict={}
        for num in nums:
            if num not in self.ndict:
                self.ndict[num]=1
            else:
                self.ndict[num]+=1
        self.res=set()
        for k in self.ndict.keys():
            target = - k
            self.ndict[k]-=1
            self.twoSum(nums,target)
            self.ndict[k]+=1
        return [[0-s[0]-s[1],s[0],s[1]] for s in self.res]

Two Sum with one pass

class Solution:
    def twoSum(self, N: List[int], t: int) -> List[int]:
        D = {}
        for i,n in enumerate(N):
            if n not in D: D[n] = i
            x = t - n
            if x in D and D[x] != i: return [i,D[x]]
            
        ```
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 8,188评论 0赞 10
  • Description: Given an array S of n integers, are there el...
    CharlieGuo阅读 268评论 0赞 1
  • 3 Sum Given an array nums of n integers, are there elemen...
    sherrysack阅读 356评论 0赞 0
  • 把身体蜷缩在浴桶里,周围是温暖的水和飘浮在水中的精油珠。不知道从什么时候开始爱上泡澡的感觉,温暖的水为我解压,帮助...
    仙仙的妈阅读 528评论 0赞 47
  • ①《不懂、不言》 只是你不懂, 所以我不言 很多故事一开场就注定了结束 不要太轻易许下诺言 最终抵不过时间 因为你...
    曦陌染紫阅读 262评论 0赞 1

友情链接更多精彩内容