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;
        }
    };
    
    
  • 相关阅读:
    maven POM.xml 标签详解
    Spring Boot Starter 的基本封装
    谷歌浏览器屏蔽广告的插件
    关于mysql中触发器old和new
    centos7 安装zookeeper3.4.8集群
    Flink架构、原理与部署测试
    图解Spark API
    汇编器构造
    Oracle11g CentOS7安装记录
    如何创造一门编程语言?
  • 原文地址:https://www.cnblogs.com/aiterator/p/6523142.html
Copyright © 2011-2022 走看看