Leetcode刻意练习----数组4
题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路
- 首先对数组进行排序
- 当 i > 0并且 nums[i] == nums[i - 1] 时,跳过此元素,防止 num[i - 1] 中有数据进入结果后发生重复
- 当该项数据大于 0 时,跳出循环,因为此时数组为升序,若此项数据大于0,则该项之后的所有数据都大于0,因此不会有满足条件的情况
- 将 n,m 赋值为 len(nums) 首尾并输入到 while 循环中,当 n < m 时,判断第 i,n,m 三项之和与 0 的 大小关系:若等于 0,记录三个数据到 a 中并执行 n += 1 和 m -=1,注意查重,排除相同数值的项;若小于0,执行 n += 1;若大于 0,执行 m -= 1 。
- 最后返回a的值
题解
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
a = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
if nums[i] > 0:
break
n = i + 1
m = len(nums) - 1
while n < m:
b = nums[i] + nums[n] + nums[m]
if b == 0:
a.append([nums[i], nums[n], nums[m]])
n += 1
m -= 1
while n < m and nums[n] == nums[n - 1]:
n += 1
while n < m and nums[m] == nums[m + 1]:
m -= 1
elif b < 0:
n += 1
else:
m -= 1
return a