leetcode 15. 3Sum

本文介绍了一种高效算法来找出数组中三个数相加等于零的所有可能组合。通过先排序数组,再使用双指针技巧遍历并检查所有可能的组合,同时避免重复解。适用于竞赛编程和技术面试。

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

数组中找到3个数字总和为0的所有组合


方法:

先排序

排完序后先确定一个数字,位置为i

接着left=i+1,right=n-1

然后就是常见的左右指针确定法,小了的话left++,大了的话right--

不过要记得除重复

用while循环方式

				right_num=nums[right];
				while(nums[--right]==right_num)



vector< vector<int> >  threeSum(vector<int>& nums) 
{
	int i,j,left,right,n,left_num,right_num,sum;
	vector< vector<int> > ans;
	vector<int> vec;
    sort(nums.begin(),nums.end());
	//for(i=0;i<nums.size();i++)
//	//	printf("%d ",nums[i]);
	//cout<<endl;

	n=nums.size();
	for(i=0;i<n;)
	{
		left=i+1;right=n-1;

		while(left<right)
		{
			sum=nums[i]+nums[left]+nums[right];
			if(sum==0)
			{
				//cout<<"!"<<endl;
				printf("i=%d,l=%d,r=%d\n",i,left,right);
				vec.resize(0);
				vec.push_back(nums[i]);
				vec.push_back(nums[left]);
				vec.push_back(nums[right]);
				ans.push_back(vec);
				
				right_num=nums[right];
				while(nums[--right]==right_num)
					;
				
				left_num=nums[left];
				while(nums[++left]==left_num)
					;
			}
			else if(sum>0)
			{
				right_num=nums[right];
				while(nums[--right]==right_num)
					;
			}
			else 
			{
				left_num=nums[left];
				while(nums[++left]==left_num)
					;
			}
		}
		left_num=nums[i];
		while(i<n&&nums[++i]==left_num)
			;
	}
	return ans;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值