排序后循环遍历,固定index位置,然后双指针移动,避免重复的时候,注意比较索引的位置是走过的位置。

    1. # 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复
    2. # 的三元组。
    3. #
    4. # 注意:答案中不可以包含重复的三元组。
    5. #
    6. #
    7. #
    8. # 示例:
    9. #
    10. # 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    11. #
    12. # 满足要求的三元组集合为:
    13. # [
    14. # [-1, 0, 1],
    15. # [-1, -1, 2]
    16. # ]
    17. #
    18. # Related Topics 数组 双指针
    19. # 👍 2486 👎 0
    20. # leetcode submit region begin(Prohibit modification and deletion)
    21. class Solution(object):
    22. def threeSum(self, nums):
    23. """
    24. :type nums: List[int]
    25. :rtype: List[List[int]]
    26. """
    27. res = []
    28. nums.sort()
    29. for index, item in enumerate(nums):
    30. # 有重复的时候,只计算一个
    31. if index > 0 and nums[index] == nums[index - 1]:
    32. continue
    33. left, right = index + 1, len(nums) - 1
    34. while left < right:
    35. sum_tmp = item + nums[left] + nums[right]
    36. if sum_tmp == 0:
    37. res.append([item, nums[left], nums[right]])
    38. left += 1
    39. right -= 1
    40. # 判断条件一定要是left比较左侧,right比较右侧,避免重复
    41. while left < right and nums[left] == nums[left - 1]:
    42. left += 1
    43. while left < right and nums[right] == nums[right + 1]:
    44. right -= 1
    45. elif sum_tmp > 0:
    46. right -= 1
    47. elif sum_tmp < 0:
    48. left += 1
    49. return res
    50. # leetcode submit region end(Prohibit modification and deletion)
    51. s = Solution()
    52. print(s.threeSum([0, 0, 0]))
    53. print(s.threeSum([-1, 0, 1, 2, -1, -4]))