【leetcode】#数组【Python】15. 3Sum 三数之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014256231/article/details/83514830

链接:

https://leetcode-cn.com/problems/3sum/

题目:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

我的解法1: 超时了,扎心了,就是三个循环遍历

class Solution(object):
    def threeSum(self, nums):
        sol = []
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                sum_2 = nums[i] + nums[j]
                for k in range(j+1,len(nums)):
                    if sum_2 == -nums[k] and sorted([nums[i],nums[j],nums[k]]) not in sol:
                        sol.append(sorted([nums[i],nums[j],nums[k]]))
                        break
        return sol       

我的解法2:通过了,但是只击败25%。思路:先排序,因为结果是三数和为0. 最小的数一定是负数或0. 固定一个数 i,j = i + 1, k = len(nums) - 1, 求三个数的和。如果小于0,说明数需要大些,就把就j+1. 如果大于0,把k-1. 直到相遇。

class Solution:
    def threeSum(self, nums):
        sol = []
        nums = sorted(nums)
        #[-1, 0, 1, 2, -1, -4] -> [-4, -1, -1, 0, 1, 2]
        for i in range(len(nums)-2):
            # 第一个数必须是负数或0
            if nums[i] <= 0:
                # 如果接连两个数一样,则跳过。比如[-4, -1, -1, 0, 1, 2],第一个-1能有[-1,0,1]的结果,第二个-1也是,所以去重。i>0是因为有nums[i-1]。
                if i>0 and nums[i] == nums[i-1]:
                    continue
                #j、k分别表示第二个数和第三个数的索引,j从前,k从后
                j = i + 1
                k = len(nums) - 1
                while j<k:
                    #也是为了去重,比如[-4, -1, -1, -1, 0, 1, 2, 2],固定第一个-1时,第二个-1和第三个-1会得到同样的结果。j=2,k=7,append[-1,-1,2]; j=3,k=6,append[-1,-1,2]重复,所以增加筛选。
                    if j-1 != i and nums[j] == nums[j-1]:
                        j += 1
                        continue
                    #满足条件,append
                    if nums[i]+nums[j]+nums[k] == 0:
                        sol.append([nums[i],nums[j],nums[k]])
                        j += 1
                        k -= 1
                    # 结果是负的,说明要增大点,小数索引右移
                    if nums[i]+nums[j]+nums[k] < 0:
                        j += 1
                    if nums[i]+nums[j]+nums[k] > 0:
                        k -= 1
        return sol

猜你喜欢

转载自blog.csdn.net/u014256231/article/details/83514830