========坚持30天刷leetcode=====
题目链接:https://leetcode-cn.com/problems/3sum/
分析:
本题承接 第1题 而来,第1题题目给定数组和target,在数组内寻找两个数a、b,使得 a+b=target 。在本题中 a+b+c=0 ,可以理解为: a+b=-c ,即 :依次把数组的每一个元素当成 负的target,运用第一题的思路,稍作修改即可AC。
注意点:本题要求返回的是 值列表,而不是第一题的索引列表;值列表不可重复,需要去重
class Solution:
def twoSum(self, nums, target): # 第一题思路,做了部分修改
h = {}
hlist=[]
k=None # 去重;标识是否已经将 相同的值对 添加进了hlist
for i, num in enumerate(nums):
if ((target - num) in h) and k!=(target - num):
hlist.append([nums[h[target - num]],nums[i]])
k=target-num
h[num] = i
return hlist
def threeSum(self, nums):
nums.sort() # 排序操作,为了去重
ll=len(nums)
result=[]
for i in range(ll):
if i!=0 and nums[i]==nums[i-1]: # 去重;已经对相同的值做了遍历寻找
continue
else:
tmp=self.twoSum(nums[i+1:], -nums[i])
if tmp:
for k in tmp: # 可能有多个值对符合条件
#print(k)
ltmp=[]
ltmp.append(nums[i])
ltmp=ltmp+k
result.append(ltmp)
#print(result)
return result