LeetCode算法【三数和为零】【Python】

题目描述

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

解题思路:

1、先排序,从小到大开始
2、最外层使用for循环, 从0到 len(nums),全部走一遍
3、每循环一次,i位置数 和
后面的数中查询两个数,使得三个数的和为0
4、后面的两个数可以定位i位置的后一个数 L 和数列中最后一个数 R
5、根据三个数的和结果,如果刚好是0,则 L+1, R-1 再找一组解
6、如果和的结果 大于0,右边的值向左移动 ,即R-1
7、如果和的结果 小于0,左边的值向右移动, 即 L+1
8、以上操作中, 可以需要多次执行(While循环),退出的条件是L < R

代码如下:

class Solution(object):
    def threeSum(self, nums):
        nums.sort() # 排序
        res = []
        for i in range(len(nums)):  # 遍历每一个数
            if i == 0 or nums[i] > nums[i - 1]:  # 确定不重复的数字(开头)
                l = i + 1
                r = len(nums) - 1
                while l < r:  # 左边的位置 必须小于 右边的位置
                    s = nums[i] + nums[l] + nums[r]  # 三个数的和
                    if s == 0:
                        res.append([nums[i], nums[l], nums[r]])
                        # 再找下一组解
                        l += 1
                        r -= 1
                        # 左边向右移动到不重复数为止
                        while l < r and nums[l] == nums[l - 1]: l += 1 
                        # 右边向左边移动不重复数为止
                        while r > l and nums[r] == nums[r + 1]: r -= 1
                    elif s > 0:
                        r -= 1
                    else:
                        l += 1
        return res

测试代码

nums = 
[
   [-1, 0, 1, 2, -1, -4],
   [-4, -1, -1, 0, 1, 2, 4],
   [-5, -3, -2, 0, 1, 2, 2, 3],
   [1, 2, -2, -1],
   [0, -4, -1, -4, -2, -3, 2],
   [0,1,1],
   [0,0,0],
   [4, 0, 2, 3, -1],
   [3, 0, -2, -1, 1, 2],
   [-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6],
   [-1, -2, -3, 4, 1, 3, 0, 3, -2, 1, -2, 2, -1, 1, -5, 4, -3],
   [-4, -2, 1, -5, -4, -4, 4, -2, 0, 4, 0, -2, 3, 1, -5, 0]
]

for datas in nums:
   print(Solution().threeSum(datas))

在这里插入图片描述

发布了176 篇原创文章 · 获赞 662 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/qq_45172832/article/details/105521624
今日推荐