三数之和

在这里插入图片描述
排序后for循环+双指针。
大体思路:虽说是双指针,其实类似于三指针,只不过第一个指针没有起到动态移动的效果。第一个指针固定后,后面两个指针动态规划,由于排序完成,这个动态分析就很好进行。
难点:需要把重复的数据去掉,所以指针移动的时候都要有个判断,就是移动前后的值是否发生了改变。若不变则会有重复数据出现。

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n=len(nums)
        re=[]
        if n<3:
            return []
        nums.sort()
        a=0.1
        for i in range(n-2):
            if a==nums[i]:
                continue
            a=nums[i]
            if a>0:
                break
            l=i+1
            r=n-1
            while l<r:
                s=nums[i]+nums[l]+nums[r]
                if s==0:
                    re.append([nums[i],nums[l],nums[r]])
                    while r>l and nums[r]==nums[r-1]:
                        r=r-1
                    r=r-1
                    while r>l and nums[l]==nums[l+1]:
                        l=l+1
                    l=l+1
                if s>0:
                    while r>l and nums[r]==nums[r-1]:
                        r=r-1
                    r=r-1                    
                if s<0:
                    while r>l and nums[l]==nums[l+1]:
                        l=l+1
                    l=l+1
        return re

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int>> ans;
        int y,z;
        int n=nums.size();
        if(n<3) return {};
        for(int i=0;i<n-1;i++)
            for(int j=i+1;j<n;j++)
                if(nums[i]>nums[j])
                {
                    int temp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                }
        float x=0.1;
        for(int i=0;i<n-2;i++)
        {
            if(x==nums[i]) continue;
            x=nums[i];
            if(nums[i]>0) break;
            int l=i+1;
            int r=n-1;
            while(l<r)
            {
                y=nums[l];
                z=nums[r];
                if(x+y+z==0)
                {
                    ans.push_back({x,y,z});
                    while(r>l&&nums[l]==nums[l+1])
                        l++;
                    l++;
                    while(r>l&&nums[r]==nums[r-1])
                        r--;
                    r--;
                }
                if(x+y+z>0)
                    {
                        while(r>l&&nums[r]==nums[r-1])
                        r--;
                        r--;                        
                    }
                if(x+y+z<0) 
                    {
                        while(r>l&&nums[l]==nums[l+1])
                        l++;
                        l++;
                    }
            }
        }
        return ans;
    }
};

在这里插入图片描述
C++击败比例虽然比不过python,可是他运行时间确实快。能把效率变成原来的800%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值