(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)的复杂度,但是只打败很少的人,水平所限先就这样吧。

相关推荐
IT毕设实战小研6 分钟前
电影数据可视化推荐系统
大数据·后端·爬虫·python·算法·信息可视化·课程设计
且随疾风前行.10 分钟前
从驱动来分析服务的添加过程
算法
zl.rs15 分钟前
配置更适合生产环境的coredump
c++
CoderYanger32 分钟前
A.每日一题:输入单词需要的最少按键次数 Ⅰ+Ⅱ
java·数据结构·算法·leetcode·面试
一木 之林44 分钟前
三.C++ 内存管理(进阶)(二)
开发语言·arm开发·c++
DLite1 小时前
开源一个静态类型语言——NLang
c++·编译器·nlang
凯尔萨厮1 小时前
Java学习笔记十(注解)
java·笔记·学习
JoannaJuanCV1 小时前
VLM学习-SFT(监督微调)
深度学习·学习·机器学习·大模型·视觉大模型·vlm·视觉编码器
uoKent1 小时前
c++中new和malloc的区别
java·jvm·c++
xiaokcehui2 小时前
地球物理大地测量学计算系列之十七局部重力场SRBF逼近及其性能指标测评
人工智能·算法·机器学习