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

相关推荐
lizhihai_996 分钟前
股市学习心得-AI 产业链核心标的梳理清单
大数据·服务器·人工智能·科技·学习
手写码匠30 分钟前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
吃好睡好便好38 分钟前
说说科学爬山
学习·生活
无限码力1 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly1 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
lunzi_08261 小时前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习
吴可可1231 小时前
SolidWorks草图转三维DWG技巧
算法
凡人叶枫1 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
tyung2 小时前
Go 手写 Wait-Free SPSC 无界队列:无 CAS、无锁、泛型节点池
数据结构·后端·go
不想写代码的星星2 小时前
std::move 根本不移动,就像老婆饼里没有老婆
c++