1.1 题目
给定一个整数数组,返回两个数字的索引,使它们加起来一个特定的target.假设每个输入都只有一个解决方案。
注意:The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
1.2 分析
给定一个数列,求a+b+c=0的问题可以转换为求a+b=-c,这样的话就回到了我们第一道题的解法上面去了,但是这样相当于又遍历循环一遍,增加了时间复杂度,然后我们可以将输入的list排序后,给定nums[i], 我们需要寻找 nums[j]+nums[k] = - nums[i], 这里的就j,k > i ,便解决题目要求不可包含重复的解,对于排序后的数组,如果num[i] = num[i+1],那么他们获得的nums[j]和nums[k]肯定是相同的(如果解存在的话),所以应该跳过这种情况。还有就是因为循环下去的遍历,前面查找过的,在后面就不会重复出现,避免了前面找到三元组,后面又找到相同的三元组,因为查找合适的-nums[i]的范围仅仅在于就j,k。这就相当于利用双指针来遍历,大大的减轻了遍历效率。
代码:
class Solution(object):
def threeSum(self, nums):
nums.sort()
L, tnum = len(nums), []
for i in range(L-2):
if i > 0 and nums[i] == nums[i-1]:
continue
target = 0 - nums[i]
j,k = i + 1, L - 1
while j<k:
if nums[j]+nums[k] == target:
tnum.append([nums[i], nums[j], nums[k]])
j = j + 1
while j<k and nums[j] == nums[j-1]:
j = j + 1
elif nums[j] + nums[k] < target:
j = j + 1
else:
k = k - 1
return tnum