算法练习题-三数之和

157 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

一、介绍

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

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:

输入:nums = []
输出:[]
示例 3:

输入:nums = [0]
输出:[]

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

二、思路解析

  • 由题目可知,在当前的数组中要找到三个元素,同时要让这三个元素的总值为0,且不重复,
  • 那么思考三个值的和为0,在当前乱序的数组中是无法得到参数的,那么就需要将该值序列化,
  • 使用sort,将数组排序,这样,就能得到一个有序数组,在有序数组中找三个元素,让他们的值等于0,会简单一些
  • 因为数组排序后是从小到大,比如nums = [-1, 0, 1, 2, -1, -4],排序后得到的值为nums = [-4, -1, -1, 0, 1, 2]
  • 这里能相当的是先定义第一个参数first,定义素组的长度,这里先拿到数组的第一个参数,拿到第一个参数后,后边需要做的就是
  • 将second和third相加的总值等于first,所以需要先通过长度,遍历数据的下标
  • 遍历第一层循环的时候,定义first,定义second和third两个下标对应参数相加和的总值target
  • 第二层循环来找第二个参数和第三个参数
  • 首先通过定义range(first + 1, n)的范围,这里要寻找第三个参数,第三个参数的第一个下标是len - 1,
  • 这里通过while 循环,当second < third and nums[second] + nums[third] > target时
  • 这里逐渐递减third
  • 这层判断是参数逐渐靠近target
  • 同时要判断,当second == third 时,那么当前for循环就不满足了,因此可以退出循环,进入下一次循环。
  • 当然,如果nums[second] + nums[third] 等于 target,那么就找到了一组满足条件的数据列表
  • 可以以数组的形式,添加到list中。
  • 当整个循环结束的时候,返回最后的结果

三、代码编写

def threeSum(self, nums: List[int]) -> List[List[int]]:
    """
    由题目可知,在当前的数组中要找到三个元素,同时要让这三个元素的总值为0,且不重复,
    那么思考三个值的和为0,在当前乱序的数组中是无法得到参数的,那么就需要将该值序列化,
    使用sort,将数组排序,这样,就能得到一个有序数组,在有序数组中找三个元素,让他们的值等于0,会简单一些
    因为数组排序后是从小到大,比如nums = [-1, 0, 1, 2, -1, -4],排序后得到的值为nums = [-4, -1, -1, 0, 1, 2]
    这里能相当的是先定义第一个参数first,定义素组的长度,这里先拿到数组的第一个参数,拿到第一个参数后,后边需要做的就是
    将second和third相加的总值等于first,所以需要先通过长度,遍历数据的下标
    遍历第一层循环的时候,定义first,定义second和third两个下标对应参数相加和的总值target
    第二层循环来找第二个参数和第三个参数
    首先通过定义range(first + 1, n)的范围,这里要寻找第三个参数,第三个参数的第一个下标是len - 1,
    这里通过while 循环,当second < third and nums[second] + nums[third] > target时
    这里逐渐递减third
    这层判断是参数逐渐靠近target
    同时要判断,当second == third 时,那么当前for循环就不满足了,因此可以退出循环,进入下一次循环。
    当然,如果nums[second] + nums[third] 等于 target,那么就找到了一组满足条件的数据列表
    可以以数组的形式,添加到list中。
    当整个循环结束的时候,返回最后的结果
    :param nums:
    :return:
    """
    n = len(nums)
    nums.sort()
    ans = list()
    # 枚举
    for first in range(n):
        if first > 0 and nums[first] == nums[first - 1]:
            continue
        third = n - 1
        target = -nums[first]
        for second in range(first + 1, n):
            if second > first + 1 and nums[second] == nums[second - 1]:
                continue
            while second < third and nums[second] + nums[third] > target:
                third -= 1
            if second == third:
                break
            if nums[second] + nums[third] == target:
                ans.append([nums[first], nums[second], nums[third]])
    return ans

四、测试结果

image.png