三数之和,力扣

本文介绍了如何使用双指针算法解决LeetCode中的三数之和问题,通过先求两数之和并处理重复元素,然后遍历数组求得每数的相反数,找到满足三数之和等于0的组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接   15. 三数之和 - 力扣(LeetCode)

思路  . - 力扣(LeetCode)

参考这位大佬的题解,我们先写了一个求两数之和的函数vector<vector<int>>towSumTarget(vector<int>& nums,int start ,int target)

采用双指针的方法,去求解数组内两数和的值等于target的所有数,

                    res.push_back({ left, right }); //压入满足条件的数组
					// 跳过所有重复的元素
					while (l < h && nums[l] == left) l++;
					while (l < h && nums[h] == right) h--;

因为在数组里有重复的元素,可能会造成重复的结果,比如(1,2),(2,1)我们采用这一步跳过重复的元素

接着求三数之和等于0,具体参考上面那位大佬的题解,这里简单写一下思路

引用求两数之和的与某个值的的函数,遍历数组,将每个值取反,作为求和的目标,放入求两数之和的函数函数里,最后如果满足条件,我们则将这个数压入

class Solution {

public:
	vector<vector<int>>towSumTarget(vector<int>& nums,int start ,int target)
	{
		sort(nums.begin(), nums.end());
		int l = start, h = nums.size() - 1;
		vector<vector<int>>res;
		while (l < h)
		{
			int sum = nums[l] + nums[h];
			int left = nums[l], right = nums[h];
			if (sum < target)
			{
				l++;
			}
			else {
				if (sum > target)h--;
				else {
					res.push_back({ left, right });
					// 跳过所有重复的元素
					while (l < h && nums[l] == left) l++;
					while (l < h && nums[h] == right) h--;

					
				}
			}


		}
		return res;
	}




	vector<vector<int>> threeSum(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		vector<vector<int>>s;
		int ans = 0;
		int n = nums.size();
		for (int i = 0; i < n; i++)
		{
			vector<vector<int>>res= towSumTarget(nums, i + 1, -nums[i]);

			
			for (vector<int>& tuple : res)
			{
				tuple.push_back(nums[i]);
				s.push_back(tuple);
			}
			// 跳过第一个数字重复的情况,否则会出现重复结果
			while (i < n - 1 && nums[i] == nums[i + 1]) i++;
		}
		/*for (vector<int>& tuple : tuples) 表示对tuples中的每个元素进行引用赋值,
		即将tuples中的每个向量(vector)都作为一个引用传递给变量tuple,
		这意味着在循环内部对tuple所做的修改都会直接反映到原tuples中的对应向量上。*/
		return s;

	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值