【数组 &双指针】Leecode-15. 三数之和

举报
子都爱学习 发表于 2023/10/12 08:18:47 2023/10/12
【摘要】 【题目】给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。 示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:...

【题目】

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

【题解】

    题解1:

  • 思路

         双for循环,在j后面的数组查找和前面加起来等于零的目标target在不在里面,在排序后添加到结果中,注意去重

  • 复杂度

         时间复杂度:O(n2),空间复杂度:O(n)

  • 代码
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n =  len(nums)
        ret = []
        for i in range(n):
            for j in range(i+1, n):
                target = -(nums[i]+nums[j])
                if target in nums[j+1:]:
                    temp = sorted([nums[i],nums[j],target])
                    if temp not in ret:
                        ret.append(temp)
        return ret

    题解2:

  • 思路:

        for + 双指针,先进行排序,for限制指针的范围,然后按照两数之和处理,注意去重

  • 复杂度

         时间复杂度:O(nlogn),空间复杂度:O(n)

  • 代码
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        n =  len(nums)
        ret = []
        for i in range(n):
            if(nums[i]>0):
                return ret
            if(i>0 and nums[i]==nums[i-1]):
                continue
            j = i+1
            k = n-1
            while j<k:
                if nums[i] + nums[j] + nums[k] == 0:
                    temp = sorted([nums[i],nums[j],nums[k]])
                    if temp not in ret:
                        ret.append(temp)
                    j += 1
                    k-=1
                elif nums[i] + nums[j] + nums[k] < 0:
                    j+=1
                else:
                    k-=1
        return ret
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。