Skip to content

Commit b9c2a70

Browse files
committed
no message
1 parent 740f160 commit b9c2a70

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

problems/python3/3sum.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
Time: O(N^2)
3+
Space: O(1)
4+
5+
First of all, we need to sort the list, so that it is easier to know where to move the pointers.
6+
(Keep in mind that sorting takes O(NLogN) of time, but since judging from the problem this solution might takes at least O(N^2), so it is ok to sort.)
7+
8+
Now, we have 3 unique pointers at the list. i, j, k, where i<j<k.
9+
For a given i, set j at i+1 and k at the rightest.
10+
11+
If the sum is too large, our only option is to move k left, so we can find smaller sum.
12+
If the sum is too small, our only option is to move j right, so we can find larger sum.
13+
If the sum is what we want, add it to the ans.
14+
15+
[0] we need to skip the num that is the same as the last one to remove duplicate. This is actually the hardest part of the problem.
16+
[1] if nums[i] is larger than 0, we can stop, since nums[i] and nums[k] are surely larger than nums[i]
17+
"""
18+
class Solution:
19+
def threeSum(self, nums: List[int]) -> List[List[int]]:
20+
ans = []
21+
nums.sort()
22+
23+
for i in range(len(nums)):
24+
if 0<i and nums[i]==nums[i-1]: continue #[0]
25+
if nums[i]>0: break #[1]
26+
27+
j, k = i+1, len(nums)-1
28+
while j<k:
29+
if nums[i]+nums[j]+nums[k]>0:
30+
k -= 1
31+
elif nums[i]+nums[j]+nums[k]<0:
32+
j += 1
33+
else:
34+
ans.append((nums[i], nums[j], nums[k]))
35+
while 0<k-1 and nums[k-1]==nums[k]: k -= 1 #[0]
36+
while j+1<len(nums) and nums[j+1]==nums[j]: j += 1 #[0]
37+
k -= 1
38+
j += 1
39+
40+
return ans

0 commit comments

Comments
 (0)