zoukankan      html  css  js  c++  java
  • 【python-leetcode15-双指针】三个数之和为零

    问题描述:

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

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

    示例:

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

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

    代码:

    class Solution:
        def threeSum(self, nums):
            #数组长度
            n = len(nums)
            if (not nums or n < 3):
                return []
            #先将数组进行排序
            nums.sort()
            #保存结果
            res = []
            #从左开始遍历数组
            for i in range(n):
                #当遍历到正数时就可以返回结果了
                if (nums[i] > 0):
                    return res
                #如果i>0且相邻两个值相等,则继续
                if (i > 0 and nums[i] == nums[i - 1]):
                    continue
                #左指针指向i的下一位
                L = i + 1
                #右指针指向数组右端
                R = n - 1
                #循环条件
                #核心就是在第i位时,考虑从i+1位到末尾,不断通过增加左指针指向的值大小
                #和减少右指针指向的值的大小来找到一个平衡位置使三者之和为0
                while (L < R):
                    #如果这三个数加起来为0
                    if (nums[i] + nums[L] + nums[R] == 0):
                        #加入结果
                        res.append([nums[i], nums[L], nums[R]])
                        #此时对左指针的下一位进行判断,如果和其相同,左指针继续右移
                        while (L < R and nums[L] == nums[L + 1]):
                            L = L + 1
                        #同理,右指针继续左移
                        while (L < R and nums[R] == nums[R - 1]):
                            R = R - 1
                        #如果不相同直接左指针右移一位
                        L = L + 1
                        #如果不相同直接右指针左移一位
                        R = R - 1
                    elif (nums[i] + nums[L] + nums[R] > 0):
                        #如果大于0,右指针左移一位
                        R = R - 1
                    else:
                        #如果小于0,左指针右移一位
                        L = L + 1
            return res

    结果:

  • 相关阅读:
    [Axiom 3D]1.初识Axiom
    [.Net]System.OutOfMemoryException异常
    一个恶心的需求
    度分秒的正则表达式
    CSLA.Net学习(3)INotifyPropertyChanged和IDataErrorInfo
    [转载]高斯正反算
    分带?不分带?
    chm帮助文档制作及C#调用
    OleDb未指定错误
    [学习笔记]工厂方法用于数据库开发
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12313290.html
Copyright © 2011-2022 走看看