LeetCode - 15. 3Sum | Two Pointers | Hash Set | Python C++

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值