15.三数和

℡╲_俬逩灬. 提交于 2020-08-08 19:36:19

思路

  • 排序.
  • 固定第一个加数,双指针遍历.
  • 三数和为: ret = nums[i] + nums[l] + nums[r]
  • 判断是否ret == 0
  • 优化: 针对重复数据,和大于0之后的数据,去重。

代码

#!/usr/bin/env python
"""
doc:
"""
from typing import List


class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums) < 3:
            return list()
        nums.sort()
        ans = list()
        visited = set()
        for i in range(len(nums)-2):

            target = nums[i]
            if target > 0:
                continue

            if target in visited:
                continue

            visited.add(target)
            l = i + 1
            r = len(nums) - 1

            while l < r:
                ret = target + nums[l] + nums[r]
                if ret == 0:
                    ret_list = [target, nums[l], nums[r]]
                    ans.append(ret_list)
                    l += 1
                    while l < r and nums[l] == nums[l-1]:
                        l += 1
                    r -= 1
                    while r > l and nums[r] == nums[r+1]:
                        r -= 1
                elif ret > 0:
                    r -= 1
                    while r > l and nums[r] == nums[r+1]:
                        r -= 1
                elif ret < 0:
                    l += 1
                    while l < r and nums[l] == nums[l-1]:
                        l += 1
        return ans


def main():
    nums = [0,0,0]
    ret = Solution().threeSum(nums)
    print(ret)


if __name__ == '__main__':
    main()
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!