文章目录:
- 题目
- 脚本一及注释
- 脚本一逻辑
- 脚本二及注释
- 脚本二逻辑
题目:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
脚本一及注释:【用时:超时,暴力破解】
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: n1 = 1 #定义一个数值为1的变量,用于不断对列表切片 nums.sort() #由于列表中元素不能重复 list1 = [] #定义一个存储结果的空列表 for i in nums: #遍历列表中的元素 nums2 = nums[n1:] #对列表进行切片 while nums2: #遍历切片的元素 j = nums2.pop(0) #弹出切片列表中的第一个元素 if -(i+j) in nums2: #对切片列表中剩余列表元素进行遍历 if [i,j,-(i+j)] not in list1: #选择总和为0的元素,并且此元素不在存放结果的列表中 list1.append([i,j,-(i+j)]) #若符合,则增加元素 n1 += 1 #n1自增 return(list1) #遍历完成后,返回结果
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: n1 = 1 nums.sort() list1 = [] for i in nums: nums2 = nums[n1:] while nums2: j = nums2.pop(0) if -(i+j) in nums2: if [i,j,-(i+j)] not in list1: list1.append([i,j,-(i+j)]) n1 += 1 return(list1)
脚本一逻辑:
- 遍历所有的不重复三元组合,并将和为0的三元元素添加到新列表中
- 这种是暴力破解的方法,结果是可行的,但再leetcode中却超时了
脚本二及注释:
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() res, k = [], 0 for k in range(len(nums) - 2): if nums[k] > 0: break # 1. because of j > i > k. if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`. i, j = k + 1, len(nums) - 1 while i < j: # 3. double pointer s = nums[k] + nums[i] + nums[j] if s < 0: i += 1 while i < j and nums[i] == nums[i - 1]: i += 1 elif s > 0: j -= 1 while i < j and nums[j] == nums[j + 1]: j -= 1 else: res.append([nums[k], nums[i], nums[j]]) i += 1 j -= 1 while i < j and nums[i] == nums[i - 1]: i += 1 while i < j and nums[j] == nums[j + 1]: j -= 1 return res
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() res, k = [], 0 for k in range(len(nums) - 2): if nums[k] > 0: break # 1. because of j > i > k. if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`. i, j = k + 1, len(nums) - 1 while i < j: # 3. double pointer s = nums[k] + nums[i] + nums[j] if s < 0: i += 1 while i < j and nums[i] == nums[i - 1]: i += 1 elif s > 0: j -= 1 while i < j and nums[j] == nums[j + 1]: j -= 1 else: res.append([nums[k], nums[i], nums[j]]) i += 1 j -= 1 while i < j and nums[i] == nums[i - 1]: i += 1 while i < j and nums[j] == nums[j + 1]: j -= 1 return res
脚本二及逻辑:
- 此题的解答必定需要遍历所有的元素,此脚本是更细致地处理列表中地值,将那些不需要地元素剔除掉,减少遍历的次数