• 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那里加个类型强转为有符号的

  • 相关阅读:
    PHP中防止SQL注入的方法
    SQLmap超详细文档和实例演示
    Spring Cloud 个人心得 理论
    Spring注解说明
    git各角色权限描述
    jenkins调用tomcat重启命令 && tomcat重启脚本
    nginx1.5 升级到1.14
    发布项目
    spring boot 多线程
    Jmeter测试http请求
  • 原文地址:https://www.cnblogs.com/lychnis/p/9250774.html
Copyright © 2020-2023  润新知