Two Pointers
def threeSum(self, nums: List[int]) -> List[List[int]]:
def twoSum(start):
left, right = start+1, len(nums)-1
target = -nums[start]
while left<right:
cur = nums[left]+nums[right]
if cur < target:
left += 1
elif cur > target:
right -= 1
else:
res.append([nums[start], nums[left], nums[right]])
left += 1
while left<right and nums[left]==nums[left-1]:
left += 1
res = []
nums.sort()
for j in range(len(nums)):
if nums[j] > 0: break
if j>0 and nums[j-1]==nums[j]:
continue
twoSum(j)
return res
Hash Set
def threeSum(self, nums: List[int]) -> List[List[int]]:
def twoSum(start):
seen = set()
i = start+1
while i<len(nums):
complement = -nums[start] - nums[i]
if complement in seen:
# complement will always be in front of nums[i]
res.append([nums[start], nums[i], complement])
while i+1<len(nums) and nums[i+1]==nums[i]:
i += 1
seen.add(nums[i])
i += 1
res = []
nums.sort()
for j in range(len(nums)):
if nums[j] > 0: break
if j>0 and nums[j-1]==nums[j]:
continue
twoSum(j)
return res
C++
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
if(nums.empty() || nums[0]>0 || nums[nums.size()-1]<0) return res;
int len = nums.size();
for(int i=0;i<len;i++){
if(nums[i]>0) break;
if(i>0 && nums[i]==nums[i-1]) continue;
int target = -nums[i], l=i+1, r=len-1;
while(l<r){
int sum = nums[l]+nums[r];
if(sum==target){
res.push_back({nums[i], nums[l], nums[r]});
while (l < r && nums[l] == nums[l + 1]) ++l;
while (l < r && nums[r] == nums[r - 1]) --r;
++l; --r;
}else if(sum<target){
l++;
}else{
r--;
}
}
}
return res;
}
};