#leetcode刷题之路15-三数之和
2019-03-06 07:15:12来源:博客园 阅读 ()
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路:先对vector进行排序,这样的话如果前两个数之和大于9,那么也就可以直接pass了
然后把vector中的数依次放入map中,暴力循环,每次计算前两个数之和,再在map中找到第三个数,存在一个set中,再把set存在一个set中,避免重复。
在不重复的情况下把这三个数放入vector中。
#include<iostream> #include<vector> #include<map> #include<set> #include <algorithm> using namespace std; vector<vector<int>> threeSum(vector<int>& nums) { map<int,int> temp; vector<vector<int>> ans; set<set<int>> anss; int len = nums.size(); int n = 0; sort(nums.begin(), nums.end()); for (int i = 0; i < len; i++) { temp[nums[i]] = i; } for (int i = 0; i < len; i++){ for (int j = i+1; j < len; j++) { int num = -nums[i] - nums[j]; if (num>0) continue; map<int, int> ::iterator add = temp.find(num); if (add == temp.end() || add->second <= j) continue; set<int> t; t.insert(nums[i]); t.insert(nums[j]); t.insert(add->first); //cout << nums[i] << nums[j] << add->first << endl; if (anss.count(t) == 0) { anss.insert(t); vector<int> t; t.push_back(nums[i]); t.push_back(nums[j]); t.push_back(add->first); ans.push_back(t); cout << nums[i] << nums[j] << add->first << endl; } } } return ans; } int main(){ vector<int> a = { -1, 0, 1, 2, -1, -4 }; vector<vector<int>> ans = threeSum(a); system("pause"); return 0; }
原文链接:https://www.cnblogs.com/biat/p/10479668.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 算法笔记刷题6 ( PAT 1003我要通过 ) 2020-05-08
- OI之路 2019-10-25
- 小白的C++之路——求质数 2019-10-25
- #leetcode刷题之路19-删除链表的倒数第N个节点 2019-03-13
- #leetcode刷题之路17-电话号码的字母组合 2019-03-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash