zoukankan      html  css  js  c++  java
  • leetcode-mid-array-31 three sum-NO

    my code:    time limited

     1 def threeSum(nums):
     2         """
     3         :type nums: List[int]
     4         :rtype: List[List[int]]
     5         """     
     6         def twoSum(a,b,c):
     7             if a + b + c == 0:
     8                 return True
     9             else:
    10                 return False
    11             
    12         res = []
    13         for i in range(len(nums)-2):
    14             a = nums[i]
    15             for j in range(i+1,len(nums)-1):
    16                 b = nums[j]
    17                 k = j +1
    18                 #print(i,j,k,a,b,nums[k])
    19                 while k < len(nums):
    20                     print(a,b,nums[k])
    21                     if twoSum(a,b,nums[k]) :
    22                         print('....',a,b,nums[k])
    23                         temp = [a,b,nums[k]]
    24                         temp.sort()
    25                         print('...temp',temp)
    26                         if temp not in res:
    27                             res.append(temp)
    28                         print('....res',res)
    29                     k += 1   
    30         return res

    思路:

    1、时间复杂度n*n

    排序 ( WT1:为什么要排序?)-》构建字典记录value:次数-》两层循环,其中不断不判断第三个数是不是也等于两层循环的值(用到dic的记录次数)

     1 class Solution(object):
     2     
     3     '''
     4     O(n^2)时间复杂度
     5     
     6     '''
     7     def threeSum(self, nums):
     8         """
     9         :type nums: List[int]
    10         :rtype: List[List[int]]
    11         """
    12         result = []
    13         num_cnt_dict = {}
    14         
    15         for num in nums:
    16             num_cnt_dict[num] = num_cnt_dict.get(num, 0) + 1
    17             
    18         if 0 in num_cnt_dict and num_cnt_dict[0] >= 3:
    19             result.append([0, 0, 0])
    20         
    21         nums = sorted(list(num_cnt_dict.keys()))
    22         
    23         for i, num in enumerate(nums):
    24             for j in nums[i+1:]:
    25                 if num * 2 + j == 0 and num_cnt_dict[num] >=2:
    26                     result.append([num, num, j])
    27                 if j * 2 + num == 0 and num_cnt_dict[j] >= 2:
    28                     result.append([j, j, num])
    29                 
    30                 diff = 0 - num - j
    31                 if diff > j and diff in num_cnt_dict:
    32                     result.append([num, j, diff])
    33         return result

    注意,以下的方式就会超时,可能是因为list和dict.keys()的检索查找方式不同

                    if diff > b and diff in nums:  #要注意>b,才能不和前面的if重合
                        res.append([a,b,diff])
            return res
    

    2、n*m 其中n+m=len(nums)

    构建dict -》 不排序,将dic的keys分为正数和负数-》两层for循环

    注意下面这一行:是因为filter得到的是有序递增数列!!!!!!!所以当diff小于a时,说明当i=diff时候,由于不满足这个条件,还没有把[a,b,diff]放入最后结果

    if diff<a or diff>b:
       res.append([a,b,diff])
     1 class Solution(object):
     2     
     3     '''
     4     O(n^2)时间复杂度
     5     
     6     '''
     7     def threeSum(self, nums):
     8         """
     9         :type nums: List[int]
    10         :rtype: List[List[int]]
    11         """
    12         res = []
    13         dic = {}
    14         for item in nums:
    15             dic[item] = dic.get(item,0) + 1   
    16         if 0 in dic and dic[0] >= 3: 
    17             res.append([0,0,0]) #为什么这个要单独列出来 -》因为除了这种情况,for循环中不会再出现三个数相等且和为0的情况
    18         #nums = sorted(list(dic.keys())) 
    19         neg = list(filter(lambda x:x<0,dic.keys()))
    20         pos = list(filter(lambda x:x>=0,dic.keys()))
    21         for a in neg:
    22             for b in pos:#为什么j的有边界不是len(nums)-1 -》因为可能会存在第三个数巧合和nums[j]相等
    23                 diff  = 0 - a - b
    24                 if diff in dic:
    25                     if diff in (a,b) and dic[diff] >= 2: 
    26                         res.append([a,b,diff])
    27                     if diff<a or diff>b:
    28                         res.append([a,b,diff])
    29         return res
  • 相关阅读:
    python 网络客户端编程端口,模块
    Python反转
    ASP.NET的路由系统
    yield 关键字
    C# Lock关键字
    C#中as和is关键字
    13.4 上下文对象
    请求生命周期
    ASP.NET常用的指令
    ASP.NET Page 指令
  • 原文地址:https://www.cnblogs.com/rosyYY/p/10963478.html
Copyright © 2011-2022 走看看