leetcode_15. 三数之和
题目
思路分析
题目要求:在数组中查找和为0的3个元素(不能重复)
找3个元素和为0,3层循环,暴力破解肯定不行。
如果是找2个元素,比较简单,用字典。找3个,没思路。
思路分析(改进.1)
参考博客https://blog.csdn.net/a_learning_boy/article/details/85171316
- 先对数组进行排序
- 最外一层循环,i 走一遍,作为第一个元素
- 在最外一层循环内,left 和 right 分别向中间靠拢。
- 还要避免重复
代码展示.1
def threeSum(self, nums):
res = []
nums.sort() ##先对元素进行排序
i = 0
numslen = len(nums)
while i<numslen-2: #以i为找到的第一个元素为基准
if nums[i]>0:
break
left=i+1
right=len(nums)-1 #left和right指针指向另外2个指针
while left<right: #left向右,right向左
iszero = nums[i]+nums[left]+nums[right]
if iszero==0: #如果找到,append
res.append([nums[i],nums[left],nums[right]])
left+=1
right-=1
elif iszero>0: #和大于0,right向左
right-=1
else: #和小于0,left向右
left+=1
i+=1
s = [] #筛选去掉重复元素
for i in res:
if i not in s:
s.append(i)
return s
代码展示.1结果
思路分析(改进.2)
要在整个思路框架中,解决判断重复的问题。
代码展示.2
def threeSum2(self, nums):
res = []
nums.sort()
i = 0
numslen = len(nums)
while i<numslen-2:
if nums[i]>0:
break
if i>0 and nums[i]==nums[i-1]: #会冲突,直接跳过
i+=1
continue
left=i+1
right=len(nums)-1
while left<right:
iszero = nums[i]+nums[left]+nums[right]
if iszero==0:
res.append([nums[i],nums[left],nums[right]])
#会冲突,直接跳过
while left<right and nums[left+1]==nums[left]:
left+=1
#会冲突,直接跳过
while left<right and nums[right-1]==nums[right]:
right-=1
left+=1
right-=1
elif iszero>0:
right-=1
else:
left+=1
i+=1
return res