zoukankan      html  css  js  c++  java
  • LeetCode 15. 3Sum

    题目大意就是给你一个数组,从里面找出三个数字,使这三个数字的和为0。
    通过先排序,枚举第一个数字a,然后可以通过前后夹逼的方法,找到两个数字b,c。使b + c = -a。那么这三个即符合题意,需要注意的是,去除重复元素。自己写的用set,感觉有点蠢。。。, 时间复杂度有点高,300多ms过的。

    class Solution
    {
    public:
        vector<vector<int> > threeSum(vector<int>& nums)
        {
            set<vector<int> > st;
            sort(nums.begin(), nums.end());
            for(int i=0; i<nums.size(); ++ i)
            {
                int t = -nums[i];
                int b = i + 1, e = nums.size() - 1;
                while(b < e)
                {
                    int sum = nums[b] + nums[e];
                    if(sum < t)
                        b ++;
                    else if(sum > t)
                        e --;
                    else
                    {
                        st.insert(vector<int> {nums[i], nums[b], nums[e]});
                        b ++, e --;
                    }
                }
            }
            vector<vector<int> > vec;
            for(auto it = st.begin(); it != st.end(); ++ it)
                vec.push_back(*it);
            return vec;
        }
    };
    

    后来观看别人代码,100多ms

    
    class Solution
    {
    public:
        vector<vector<int> > threeSum(vector<int>& nums)
        {
            sort(nums.begin(), nums.end());
            vector<vector<int> >vec;
            for(int i=0; i<nums.size(); ++ i)
            {
                int t = -nums[i];
                int b = i + 1, e = nums.size() - 1;
                while(b < e)
                {
                    int sum = nums[b] + nums[e];
                    if(sum < t)
                        b ++;
                    else if(sum > t)
                        e --;
                    else
                    {
                        int y = nums[b], z = nums[e];
                        vec.push_back(vector<int> {nums[i], nums[b], nums[e]});
                        b ++, e --;
                        while(b < e && nums[b] == y)
                            b ++;
                        while(b < e && nums[e] == z)
                            e --;
                    }
                }
                while(i+1 < nums.size() && nums[i] == nums[i+1])
                    i ++;
            }
            return vec;
        }
    };
    
    
  • 相关阅读:
    Floyd算法
    递归函数的学习
    动态联编【转】
    哈希hash
    sizeof与strlen
    写入文件和读取文件信息—Java Card开发第三篇
    文件系统创建—Java Card开发第二篇
    获取缓冲区内容与将缓冲区内容返回—Java card开发第一篇
    i++与++i
    电脑无法登陆ftp
  • 原文地址:https://www.cnblogs.com/aiterator/p/6523142.html
Copyright © 2011-2022 走看看