• 3Sum


    题目链接

    3Sum - LeetCode

    注意点

    • 和two sum那道题不一样的是这题返回的是具体的数字,不是下标

    解法

    解法一:将每个数字都作为target,剩下的数字按照two sum那道题来做,得到的结果先排序然后放进set,保证没有重复的结果。因为用了太多STL容器所以...时间复杂度为O(我也不知道怎么算)

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            int i,n = nums.size(),target;
            set<vector<int>> ansSet;
            map<int,int> myMap;
            vector<int> anw;
            for(i = 0;i < n;i++)
            {
                target = -nums[i];
                int j;
                for(j = 0;j < n;j++)
                {
                    if(j != i)
                    {
                        if(myMap.count(target - nums[j]))
                        {
                            anw.push_back(nums[j]);
                            anw.push_back(target - nums[j]);
                            anw.push_back(-target);
                            sort(anw.begin(),anw.end());
                            ansSet.insert(anw);
                            anw.clear();
                        }
                        myMap[nums[j]] = j;
                    }  
                }
                myMap.clear();
                anw.clear();
            }
            vector<vector<int>> ans;
            n = ansSet.size();
            set<vector<int>>::iterator it;   
            for(it=ansSet.begin();it!=ansSet.end();it++)
            {
                ans.push_back(*it);
            }
            return ans;
        }
    };
    

    解法二:因为这道题返回的是具体的数字,所以可以直接用sort()先对输入进行排序。然后和解法一一样每个数字都作为target,但是不一样的是,因为是有序的数组所以可以维护双指针加快速度,并且跳过重复的数字加快速度,同时因为跳过了重复的数字,就不需要对结果去重了。时间复杂度O(n^2)

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            int n = nums.size(),target,i = n-1,j,k;
            vector<vector<int>> ans;
            while(i >= 2)
            {
                target = -nums[i];
                j = 0;
                k = i-1;
                while(j < k)
                {
                    int temp = nums[j]+nums[k];
                    if(temp < target)
                    {
                        j++;
                    }
                    else if(temp > target)
                    {
                        k--;
                    }
                    else
                    {
                        vector<int> v = {nums[i], nums[j], nums[k]};
                        ans.push_back(v);
                        j++;
                        k--;
                        while(j < k && nums[j-1] == nums[j])
                        {
                            j++;
                        }
                        while(j < k && nums[k+1] == nums[k])
                        {
                            k--;
                        }
                    }
                }
                i--;
                while(nums[i+1]==nums[i])
                {
                    i--;
                }
            }
            return ans;
        }
    };
    

    小结

    • 慎用stl容器!不然你不知道你的程序时间复杂度和空间复杂度会变成什么鬼样子
  • 相关阅读:
    JS实战 · 表单验证
    JS实战 · 仿css样式选择器
    JS实战 ·  收缩菜单表单布局
    cookie自动登录的实现
    redis 3.2.5单机版安装、使用、systemctl管理Redis启动、停止、开机启动
    yum问题解决
    配置yum镜像源
    shell笔记
    CCIE总结:路由器、交换机
    云主机如何挂在磁盘
  • 原文地址:https://www.cnblogs.com/multhree/p/10329725.html
Copyright © 2020-2023  润新知