持续创作,加速成长!这是我参与「掘金日新计划 · 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