15. 三数之和(leetcode)

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

我一拿到这题,就想着暴力破解,三重循环,i<j<k,这样也不用担心遍历重复了,但是这题还要考虑,给定的数组 nums 里元素重复。

答案思路:双指针法,用双重循环,其中一层循环双指针,一个循环两个变量,时间复杂度就减少了。

  第一层固定元素k,第二层循环指针 i,j 

  k<i<j

收获:

  1.本题学到了双指针法,一个指向头,一个指向尾,A情况头指针++,B情况尾指针--,C情况 头指针++ 尾指针--;

  2.学会了遍历List时候 去重的程序写法,看起来很舒服。

    i += 1

扫描二维码关注公众号,回复: 8943121 查看本文章

    while i < j and nums[i] == nums[i-1]: i += 1

    注: 是 i == i-1 不是 i == i+1 : 因为是判断现在与过去,不是现在与将来。

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums) < 3:
            return None
        nums.sort()
        res = []
        k = 0
        while k < len(nums):
            if nums[k] > 0 :
                break
            i,j = k+1,len(nums) - 1
            while i < j:
                curVal = nums[k] + nums[i] + nums[j]
                if curVal == 0:
                    res.append([nums[k],nums[i],nums[j]])
                    i = 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
                elif curVal < 0:
                    i += 1
                    while i<j and nums[i] == nums[i-1]:i+=1
                elif curVal > 0:
                    j -= 1
                    while i <j and nums[j] == nums[j+1]: j-=1
            k+=1
            while k<len(nums) and nums[k] == nums[k-1]: k+=1
        return res


猜你喜欢

转载自www.cnblogs.com/ChevisZhang/p/12242597.html