• 【LeetCode】15. 3Sum


    Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

    题意:找出数组中所有和为0的不同的三个数,从小到大排列

    思路:

    刚开始想用双指针,然后在两个指针中间去找第三个数,但是想不到边上的两个指针往中间递进的条件。

    然后就只有先确定一个数,然后用双指针去找另外两个数

     1 class Solution(object):
     2     def threeSum(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: List[List[int]]
     6         """
     7         l = len(nums)
     8         if l<3:
     9             return []
    10         res = []
    11         nums.sort()
    12         i=0
    13         while(i<l-2):
    14             if nums[i]>0:
    15                 break;
    16             target = 0 - nums[i]
    17             start = i+1;end = l-1
    18             while start<end:
    19                 tmp = nums[start] + nums[end]
    20                 if tmp>target:
    21                     end-=1
    22                 elif tmp<target:
    23                     start+=1
    24                 else:
    25                     res.append([nums[i],nums[start],nums[end]])
    26                     t = start
    27                     while start<end and nums[t]==nums[start]:      #略过相同的数
    28                         start+=1
    29                     t = end
    30                     while start<end and nums[t]==nums[end]:        #略过相同的数
    31                         end-=1
    32             t=i
    33             while i<l-2 and nums[t]==nums[i]:
    34                 i+=1
    35         return res

     .。。终于想到了,可以用双指针,用二分法找第三个值,但是要用到递归

    。。。但是这种方法没ac,因为递归生成输出的结果。。。。有重复,这个题够折磨了,先到这吧

     1 class Solution(object):
     2     def threeSum(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: List[List[int]]
     6         """
     7         l = len(nums)
     8         if l<3:
     9             return []
    10         res = []
    11         nums.sort()
    12         start=0;end=l-1
    13         flag=0
    14         while start<end-1:
    15             tmp = nums[start]+nums[end]
    16             target = 0-tmp
    17             mid = (start+end)//2
    18             tstart=start;tend=end
    19             while tstart<mid<tend and nums[tstart]<=target<=nums[tend]:
    20                 if nums[mid]==target:
    21                     flag=1
    22                     res.append([nums[start],nums[mid],nums[end]])
    23                     break
    24                 elif nums[mid]>target:
    25                     t=mid
    26                     mid=(tstart+mid)//2
    27                     tend=t
    28                 else:
    29                     t = mid
    30                     mid=(mid+tend)//2
    31                     tstart=t
    32             if flag==1:
    33                 flag=0
    34                 
    35                 subnums=self.threeSum(nums[start:end])
    36                 if subnums!=[]:
    37                     for x in subnums:
    38                         res.append(x)
    39                 
    40                 subnums=self.threeSum(nums[start+1:end+1])
    41                 if subnums!=[]:
    42                     for x in subnums:
    43                         res.append(x)
    44                             
    45                 t=start
    46                 while start<end and nums[t]==nums[start]:
    47                     start+=1
    48                 t=end
    49                 while start<end and nums[t]==nums[end]:
    50                     end-=1
    51             else:
    52                 if tmp<0:
    53                     start+=1
    54                 else:
    55                     end-=1
    56         
    57         return res
  • 相关阅读:
    pom.xml 报错
    微信支付,提示当前页面URL未注册
    echarts + highcharts 柱状图
    二维码生成
    Eclipse
    SQLServer 安装及配置
    模板引擎doT.js用法详解
    SQL Server 笔记
    Flex 弹性盒模型
    查看Linux是Redhat 还是centos 还是...
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6211970.html
Copyright © 2020-2023  润新知