版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014256231/article/details/83514830
链接:
https://leetcode-cn.com/problems/3sum/
题目:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
我的解法1: 超时了,扎心了,就是三个循环遍历
class Solution(object):
def threeSum(self, nums):
sol = []
for i in range(len(nums)):
for j in range(i+1, len(nums)):
sum_2 = nums[i] + nums[j]
for k in range(j+1,len(nums)):
if sum_2 == -nums[k] and sorted([nums[i],nums[j],nums[k]]) not in sol:
sol.append(sorted([nums[i],nums[j],nums[k]]))
break
return sol
我的解法2:通过了,但是只击败25%。思路:先排序,因为结果是三数和为0. 最小的数一定是负数或0. 固定一个数 i,j = i + 1, k = len(nums) - 1, 求三个数的和。如果小于0,说明数需要大些,就把就j+1. 如果大于0,把k-1. 直到相遇。
class Solution:
def threeSum(self, nums):
sol = []
nums = sorted(nums)
#[-1, 0, 1, 2, -1, -4] -> [-4, -1, -1, 0, 1, 2]
for i in range(len(nums)-2):
# 第一个数必须是负数或0
if nums[i] <= 0:
# 如果接连两个数一样,则跳过。比如[-4, -1, -1, 0, 1, 2],第一个-1能有[-1,0,1]的结果,第二个-1也是,所以去重。i>0是因为有nums[i-1]。
if i>0 and nums[i] == nums[i-1]:
continue
#j、k分别表示第二个数和第三个数的索引,j从前,k从后
j = i + 1
k = len(nums) - 1
while j<k:
#也是为了去重,比如[-4, -1, -1, -1, 0, 1, 2, 2],固定第一个-1时,第二个-1和第三个-1会得到同样的结果。j=2,k=7,append[-1,-1,2]; j=3,k=6,append[-1,-1,2]重复,所以增加筛选。
if j-1 != i and nums[j] == nums[j-1]:
j += 1
continue
#满足条件,append
if nums[i]+nums[j]+nums[k] == 0:
sol.append([nums[i],nums[j],nums[k]])
j += 1
k -= 1
# 结果是负的,说明要增大点,小数索引右移
if nums[i]+nums[j]+nums[k] < 0:
j += 1
if nums[i]+nums[j]+nums[k] > 0:
k -= 1
return sol