Leetcode 15 -- 三数之和 --Python

Leetcode 15 -- 三数之和 --Python

  • 题目
    • 题目分析

题目

Leetcode 15 -- 三数之和 --Python_第1张图片

题目分析

  • 首先看到题目,不知道大家有没有觉得和两数之和的题目有些相似。最直接的方法就是暴力法,设置三个for循环,时间复杂度为O(n3), 空间复杂度为O(1),此方法虽简单,但是会超过时间限制。代码段如下
//暴力法
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:        
        new_three = []
        nums.sort()
        for i, j in enumerate(nums):
            for m in range(i+1,len(nums)):
                for n in range(m+1, len(nums)):
                    if j+nums[m]+nums[n] == 0:
                        temp = [j, nums[m], nums[n]]
                        flag = 0       //判断三元组是否重复的一个标志
                        for p, q in enumerate(new_three):
                            if set(q) == set(temp):
                                flag = 1
                        if flag == 0:
                             new_three.append(temp)
        return new_three
                        
  • 下面介绍第二种方法:
    (1)题目中最后要得到三个数,而且不能重复是关键,所以首先我们给nums排序,只需要一个for循环即可,利用for循环确定三个数中的第一个,因为我们已经排好序,如果第一个数大于0,就不需要再去找之后的两个.
    (2) 确定了第一个数之后,在nums之后的列表里可以采用双指针,一个头指针m一个尾指针n,有点类似快速排序的思想,用while,如果m>n,结束一次while。代码段如下
//双指针法
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:                
        nums.sort()
        new_three = []
        for i in range(len(nums)-2):
            if (i==0 or nums[i]>nums[i-1]) and nums[i]<1:
                m = i+1
                n = len(nums)-1
                while m<n:
                    if nums[i]+nums[m]+nums[n] == 0:
                        temp = [nums[i], nums[m], nums[n]]
                        new_three.append(temp)
                        if m+1== len(nums)-1:
                            break
                        while nums[m+1]==nums[m] and m<n:
                            if m+1== len(nums)-1:
                                break
                            m = m+1
                        while nums[n-1]==nums[n] and n>m:
                            n = n-1
                        
                        n = n-1
                        m = m+1
                    elif nums[i]+nums[m]+nums[n] > 0:
                        n=n-1
                    elif nums[i]+nums[m]+nums[n] < 0:
                        m=m+1
        return new_three
                        

每天一点进步,加油!。1


  1. @Qichao ↩︎

你可能感兴趣的:(LeetCode)