Leetcod-15.三数之和

https://leetcode-cn.com/problems/3sum/submissions/

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

题解:(1)之前做过两数之和,可以把这个简化为两数之和的问题。

           (2)注意重复元素的剔除,先排序,每次第一层遍历的时候可以把重复的数据跳过

           (3)每次第一层遍历的时候可以把大于0的数剔除,减少了查找的数量

           (4)查找的时候从两边开始各取一值,注意把当前处理的元素跳过,处理方式有点像快排

#Python3
result = []
    # 边界判断
    if len(nums) < 3:
        return result

    #排序
    sumsort = sorted(nums)

    #查找
    left = 0
    right = len(sumsort) - 1
    for index in range(len(sumsort)):   #第一层遍历 固定一个元素为target
        if sumsort[index] > 0:
            break
        if index > 0 and sumsort[index] == sumsort[index - 1]:
            continue
        left = index + 1
        right = len(sumsort) - 1
        target = -sumsort[index]
        while left < right:            #从list中找target 分别从两端取数求和判断
            twosum = sumsort[left] + sumsort[right]
            if twosum != target:
                if target > twosum:
                    left += 1
                else:
                    right -= 1
            else:
                temp = [sumsort[index], sumsort[left], sumsort[right]]
                result.append(temp)
                while left < right and sumsort[left] == sumsort[left + 1]:
                    left += 1
                while left < right and sumsort[right] == sumsort[right - 1]:
                    right -= 1
                left += 1
                right -= 1
    return result

 

你可能感兴趣的:(剑指offer刷题记录)