15. 3Sum

Posted lychnis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15. 3Sum相关的知识,希望对你有一定的参考价值。

class Solution {
public:
    typedef vector<int> VI;
    typedef vector<VI> VVI;
    vector<vector<int>> threeSum(vector<int>& nums) {
        VVI r;
        VI v;
        sort(nums.begin(),nums.end());
        int sum=0;
        for(int i=0;i<(int)nums.size()-2;++i)
        {
            if(i&&nums[i]==nums[i-1])continue;
            sum=-nums[i];
            int j=i+1,k=nums.size()-1;
            while(j<k)
            {
                if(sum==nums[j]+nums[k])
                {
                    v.push_back(nums[i]);
                    v.push_back(nums[j]);
                    v.push_back(nums[k]);
                    r.push_back(v);
                    v.clear();
                    while(j<k&&nums[j]==nums[j+1])++j;
                    while(j<k&&nums[k]==nums[k-1])--k;
                    ++j;
                    --k;
                    continue;
                }
                if(nums[j]+nums[k]<sum)++j;
                else --k;
            }
        }
        return r;
    }
};

  

1

本题不能用 N sum的思路去做, 就是那种循环每个数字, push进去递归,然后pop出来那种, 直接timelimitexceed, 因为这里是3sum, 要优化一下;

答案的方法是第一个数字循环, 第二个和第三个一起循环, 所以是O(n*n),  如果用那种N sum写法得是 O(n3)了

2

本题有个坑爹的问题是空数组竟然coredump了.. 看了老半天明明有 i< num.size()-2的判断啊, 怎么会走进去的?????

调试了一下发现size方法返回的是size_t类型, 这个是无符号的, 所以你size-2本来是负数, 因为无符号问题变成了一个超大的数字; 看来编译器是把i转为无符号来跟这个数字比较的, 所以就走进去循环了

改法,  把size那里加个类型强转为有符号的

以上是关于15. 3Sum的主要内容,如果未能解决你的问题,请参考以下文章

15. 3Sum

15. 3Sum

15. 3Sum

leetcode 15 3Sum

[leetcode][15] 3Sum

15. 3Sum