15. 三数之和

题目

给你一个整数数组 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 。

提示:

3 <= nums.length <= 3000
-105 <= nums[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. 排序+暴力

超出时间限制

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        # print(nums)
        li = []
        # 三次循环遍历
        for i in range(len(nums) - 2):
            for j in range(i + 1, len(nums) - 1):
                for k in range(j + 1, len(nums)):
                    if nums[i] + nums[j] + nums[k] == 0 and [nums[i], nums[j], nums[k]] not in li :
                        li.append([nums[i], nums[j], nums[k]])
        return li

2. 排序+双指针

执行用时:4840 ms, 在所有 Python 提交中击败了7.84%的用户
内存消耗:18.6 MB, 在所有 Python 提交中击败了95.04%的用户
通过测试用例:
312 / 312

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # 列表排序
        nums = sorted(nums)
        # 获取长度
        ln = len(nums)
        # 初始化答案
        res = []
        # for loop 遍历第一个数
        for i in range(ln):
        	# 第二个数从第一个后面一位开始,第三个数从最后开始
            l,r = i+1,ln-1
            # 双指针查找
            while l < r:
            	# 三个数的总和
                sumN = nums[i] + nums[l] + nums[r]
                # 如果总和为0
                if sumN == 0:
                	# 判断是否已经在res中出现过,如果已经出现过,则不添加,换言之没现才添加
                    if [nums[i],nums[l],nums[r]] not in res:
                        res.append([nums[i],nums[l],nums[r]])
                    # 继续查找,直到l<r
                    r-=1
                    l+=1
                # 总和大于零,说明值大了
                # 因为是已经排序了的列表,所以第三个数往左移动可以减小总和
                elif sumN > 0:
                    r -= 1
                # 同理,值小了就让l往右移动
                else:
                    l += 1
        # 返回答案
        return res

3. 优化


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值