找出一个列表中所有和为零的三元组。要求求出的三元组中没有重复。
注意点:
例子:
输入: nums=[-1, 0, 1, 2, -1, -4]
输出: [[-1, -1, 2], [-1, 0, 1]]
求一个列表中所有和为零的二元组的一种思路是先把列表排序,再用两个指针从两头向中间移动。如果前后两个数的和小于0,则左指针右移;如果和大于0,则右指针左移。求三元组时可以参考这种做法,第一个数a确定后,可以理解为求列表中和为-a的二元组。由于不要考虑重复的元组,遇到重复的数可以直接跳过。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# Sorted array can save a lot of time
nums.sort()
result = []
i = 0
while i < len(nums) - 2:
j = i + 1
k = len(nums) - 1
while j < k:
l = [nums[i], nums[j], nums[k]]
if sum(l) == 0:
result.append(l)
j += 1
k -= 1
# Ignore repeat numbers
while j < k and nums[j] == nums[j - 1]:
j += 1
while j < k and nums[k] == nums[k + 1]:
k -= 1
elif sum(l) > 0:
k -= 1
else:
j += 1
i += 1
# Ignore repeat numbers
while i < len(nums) - 2 and nums[i] == nums[i - 1]:
i += 1
return result
if __name__ == "__main__":
assert Solution().threeSum([-1, 0, 1, 2, -1, -4]) == [[-1, -1, 2], [-1, 0, 1]]
欢迎查看我的Github来获得相关源码。
原文:http://blog.csdn.net/u013291394/article/details/50358081