题解 | #三数之和#

三数之和

https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
          unordered_multimap<int, int> themap;
        vector<vector<int>> res;

        //先将数组存到map中,这样将复杂度降到O(n^2)
        for (int i = 0; i < num.size(); ++i)
        {
            themap.insert(make_pair(num[i], i));
        }

        //两层循环计算nums[i]+nums[j],并寻找nums[k]
        for (int i = 0; i < num.size(); ++i)
        {
            for (int j = i + 1; j < num.size(); ++j)
            {
                auto range = themap.equal_range(-(num[i] + num[j]));//这里返回的是一个pair
                for(auto it=range.first;it!= range.second;++it)
                {
                    if (it->second != i && it->second != j)//不能重复使用同一个索引
                    {
                        vector<int> tmpres{num[i],num[j],it->first};
                        sort(tmpres.begin(), tmpres.end());
                        res.push_back(tmpres);
                    }
                }
            }
        }

        //去重
        //排序
        sort(res.begin(), res.end(), [](const vector<int>& p1,const vector<int>& p2)->bool{
		  //按照从左到右比大小的顺序排列
                for (int i = 0; i < 3; ++i)
                {
                    if (p1[i] < p2[i])
                    {
                        return true;
                    }
                    else if(p1[i]==p2[i])
                    {
                        continue;
                    }
                    else
                    {
                        return false;
                    }
                }
                return false;
            });
        vector<vector<int>> termres;
        if(res.empty())
            return res;
	  
	  //去除相同的元素,此时相同的元素都是相邻的
        termres.push_back(*res.begin());

        for (auto it = res.begin(); it != res.end(); ++it)
        {
            if (*it != termres[termres.size() - 1])
                termres.push_back(*it);
        }
        return termres;
    }
};

这个方法在原数组中有元素大量重复的时候使用unordered_multimap的查询复杂度会变成O(n),不再是O(1),这样综合下来复杂度变成了O(n^3),所以这个方法可能通不过测试

全部评论

相关推荐

不愿透露姓名的神秘牛友
2024-12-30 18:02
程序员牛肉:1.可以标记一下自己的学校是985,有一些hr可能没想到你这个院校是985的。 2.简历所呈现出来的能力还是有点差的,苍穹外卖+黑马点评。这在java技术域里面也就是刚学三四个月的样子,大厂现在招人少,小厂又更加希望你能直接过来干活。就你简历上呈现出来的能力,确实是有点难找,肉眼可见的不懂技术。 第一个项目中:简单的使用redis也算是亮点嘛?使用jwt,threadlocal也算是亮点?你不就是调了几个包嘛?Nginx作为服务器也能写出来,这不是前端的活嘛? 第二个项目中:分布式锁+mq消息队列+Lua队列。真没啥好问的。属于面试官看一眼就阳痿的简历,没有任何想提问的欲望。 我给你建议是好好的挖一挖这个项目吧,其实苍穹外卖和黑马点评这两个项目很不错了,只不过是太烂大街了导致面试官没啥问的兴趣,所以不太推荐写简历上。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务