力扣第15题 三数之和 python

吃可爱长大的小学妹 提交于 2020-03-04 22:05:59

思路:

这个题有点难,如果暴力算法一定超时,然后采用了双指针,但是考虑方面有点多,要先排序,再排除一些不可能的情况,再讨论去重(分别在k,j,i)再进行定k,同时i和j进行双指针算法,i进行i++,j进行j–

组织以后:先顺序排序,再从头到尾,循环取一个值(k),作为三数之一。 循环内,另外两个数(i和j),分别从左边最近的(i),以及最后的(j)开始取值,求和。 和为0,则加入结果数组,同时两数向内分别移动,并判断去重。 和大于0,则后面的数前移,同样判断去重。 和小于0,则前面的数后移,同样判断去重。 最后,递增第一个数下标的同时,判断去重。

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        result,k=[],0
        for k in range(len(nums)-2):
            if nums[k]>0:
                break
            if k >0and nums[k] == nums[k-1]:
                continue
            i,j=k+1,len(nums)-1
            while i<j:
                s=nums[k]+nums[i]+nums[j]
                if s<0:
                    i+=1
                    while i <j and nums[i]==nums[i-1]:
                        i+=1
                elif s > 0:
                    j -=1
                    while i<j and nums[j]==nums[j+1]:
                        j -= 1
                else:
                    result.append([nums[k],nums[i],nums[j]])
                    i+=1
                    j-=1
                    while i < j and nums[i]==nums[i-1]:
                        i+=1
                    while i<j and nums[j]==nums[j+1]:
                        j-=1
        return result

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!