0%

15. 3Sum

two pointers O(n2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for i in range(n):
if i > 0 and nums[i - 1] == nums[i]: continue
t = -nums[i]
l, r = i + 1, n - 1
while l < r:
s = nums[l] + nums[r]
if s == t:
res.append([nums[i], nums[l], nums[r]])
l += 1
while l < r and nums[l - 1] == nums[l]: l += 1
r -= 1
while l < r and nums[r] == nums[r + 1]: r -= 1
elif s < t:
l += 1
while l < r and nums[l - 1] == nums[l]: l += 1
else:
r -= 1
while l < r and nums[r] == nums[r + 1]: r -= 1
return res
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < n; ++i) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
long t = -(long)nums[i];
int l = i + 1, r = n - 1;
while (l < r) {
long s = (long)nums[l] + nums[r];
if (s == t) {
res.push_back({nums[i], nums[l], nums[r]});
do { ++l; } while (l < r && nums[l] == nums[l - 1]);
do { --r; } while (l < r && nums[r] == nums[r + 1]);
} else if (s < t) {
do { ++l; } while (l < r && nums[l] == nums[l - 1]);
} else {
do { --r; } while (l < r && nums[r] == nums[r + 1]);
}
}
}
return res;
}
};