diff --git a/python/0015-3sum.py b/python/0015-3sum.py index c3396fecf..f9a1463bb 100644 --- a/python/0015-3sum.py +++ b/python/0015-3sum.py @@ -1,27 +1,28 @@ class Solution: - def ThreeSum(self, integers): - """ - :type integers: List[int] - :rtype: List[List[int]] - """ - integers.sort() - result = [] - for index in range(len(integers)): - if integers[index] > 0: + def threeSum(self, nums: List[int]) -> List[List[int]]: + res = [] + nums.sort() + + for i, a in enumerate(nums): + # Skip positive integers + if a > 0: break - if index > 0 and integers[index] == integers[index - 1]: + + if i > 0 and a == nums[i - 1]: continue - left, right = index + 1, len(integers) - 1 - while left < right: - if integers[left] + integers[right] < 0 - integers[index]: - left += 1 - elif integers[left] + integers[right] > 0 - integers[index]: - right -= 1 + + l, r = i + 1, len(nums) - 1 + while l < r: + threeSum = a + nums[l] + nums[r] + if threeSum > 0: + r -= 1 + elif threeSum < 0: + l += 1 else: - result.append([integers[index], integers[left], integers[right]]) # After a triplet is appended, we try our best to incease the numeric value of its first element or that of its second. - left += 1 # The other pairs and the one we were just looking at are either duplicates or smaller than the target. - right -= 1 # The other pairs are either duplicates or greater than the target. - # We must move on if there is less than or equal to one integer in between the two integers. - while integers[left] == integers[left - 1] and left < right: - left += 1 # The pairs are either duplicates or smaller than the target. - return result + res.append([a, nums[l], nums[r]]) + l += 1 + r -= 1 + while nums[l] == nums[l - 1] and l < r: + l += 1 + + return res