(leetcode学习)15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

示例 1:

复制代码
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

复制代码
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

复制代码
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

第一次写的时候没想到先排序,写的确实是构式。

cpp 复制代码
vector<vector<int>> threeSum(vector<int>& nums) {
	sort(nums.begin(), nums.end());
	vector<vector<int>> res;
	unordered_map<int, vector<vector<int>>> sum_2;
	unordered_map<string, int> res_m;
	for (int i = 0; i < nums.size(); i++) {
		for (int j = i + 1; j < nums.size(); j++) {
			if (sum_2.find(nums[j]) != sum_2.end())
			{
				vector<vector<int>> cur_vv = sum_2.find(nums[j])->second;
				for (int k = 0; k < cur_vv.size(); k++) {
					vector<int> cur_v = cur_vv[k], cur_res;
					if (j == cur_v[2] || j == cur_v[3]) continue;
					cur_res.push_back(nums[j]);
					cur_res.push_back(cur_v[0]);
					cur_res.push_back(cur_v[1]);
					sort(cur_res.begin(), cur_res.end());
				
					string cur_str = to_string(cur_res[0]) + to_string(cur_res[1]) + to_string(cur_res[2]);
					if (res_m.find(cur_str) == res_m.end()) {
						res.push_back(cur_res);
						res_m.insert(make_pair(cur_str, 1));
					}
				}
			}
			else {
				vector<int> cur_v = { nums[i], nums[j], i, j };
				int num = -nums[i] - nums[j];
				if (sum_2.find(num) == sum_2.end() ){
					vector<vector<int>> cur_vv;
					cur_vv.push_back(cur_v);
					sum_2.insert(make_pair(num, cur_vv));
				}
				else {
					sum_2.find(num)->second.push_back(cur_v);
				}
			}
		}
	}
	return res;
}

第二次用排序之后,用二重循环加哈希表,感觉是o(n)的复杂度,但是只打败很少的人,水平所限先就这样吧。

相关推荐
饮长安千年月1 小时前
Linksys WRT54G路由器溢出漏洞分析–运行环境修复
网络·物联网·学习·安全·机器学习
红花与香菇2____1 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
mit6.8241 小时前
[实现Rpc] 通信类抽象层 | function | using | 解耦合设计思想
c++·网络协议·rpc
laimaxgg2 小时前
Qt常用控件之单选按钮QRadioButton
开发语言·c++·qt·ui·qt5
尼尔森系3 小时前
排序与算法:希尔排序
c语言·算法·排序算法
AC使者4 小时前
A. C05.L08.贪心算法入门
算法·贪心算法
冠位观测者4 小时前
【Leetcode 每日一题】624. 数组列表中的最大距离
数据结构·算法·leetcode
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker
sushang~4 小时前
leetcode203.移除链表元素
数据结构·链表