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

相关推荐
点云SLAM21 分钟前
PyTorch 中.backward() 详解使用
人工智能·pytorch·python·深度学习·算法·机器学习·机器人
only-qi1 小时前
146. LRU 缓存
java·算法·缓存
yuxb731 小时前
Docker学习笔记(二):镜像与容器管理
笔记·学习·docker
LFly_ice2 小时前
学习React-9-useSyncExternalStore
javascript·学习·react.js
梁辰兴2 小时前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Murphy_lx2 小时前
Lambda表达式
开发语言·c++
yangpipi-2 小时前
C++并发编程-23. 线程间切分任务的方法
开发语言·c++
Lris-KK3 小时前
【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量
sql·leetcode
野犬寒鸦3 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜3 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode