leetcode_15. 3Sum

本文详细解析了求解三数之和问题的高效算法,采用排序加双指针技术实现O(n^2)的时间复杂度,并介绍了如何有效避免重复解的问题。


vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> result;
        int len=nums.size();//若向量中的个数不变,可自设变量保存
        for(int i=0;i+2<len&&nums[i]<=0;i++)//当nums向量中的个数为0时,i<nums.size()-2会出错,似乎此时右边是不能计算的,必须写出i+2<nums.size()
        {
            int first=i+1,last=len-1;
            while(first<last)
            {
                int target=0-nums[i]-nums[first];
                if(nums[last]>target) last--;
                else if(nums[last]<target) first++;
                else
                {
                vector<int> triplet(3, 0);//二维向量的添加,刚开始注意不能直接调用vector[0],越界
                triplet[0] = nums[i];
                triplet[1] = nums[first];
                triplet[2] = nums[last];
                result.push_back(triplet);
                while(nums[first]==nums[first+1]) first++;//仅当找到一成功样例时,才判断是否跳过重复数字,不能放在括号外!
                while(nums[last]==nums[last-1]) last--;
                first++;last--;
                }
            }
            while(i+1<len&&nums[i]==nums[i+1]) i++;     
        }
        return result;
    }


本题若可以用散列的方法,很明显就是O(n^2)的复杂度,但由于不知道数字范围,所以无法散列,若排序后二分查找,则是O(n^2*lgn)的复杂度,但不够快。在确定一个数字的情况下,从头尾同时双向遍历,最终仍为O(n^2)的复杂度。此时充分地利用了数理逻辑,减少不必要地查找。
但是,更麻烦地是,答案中会出现重复的情况,需要思考如何快速去重?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值