【蓝桥第四周】ThreeSum

本文描述了一个算法,用于从整数数组中找到三个元素之和为零且元素按非递减顺序排列的序列,通过深度搜索和排序来解决此问题。

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

ThreeSum

题目描述 Description
假设n个整数数组S, a、b、c均为数组S中的元素,要求找出不重复的序列,其中a + b + c = 0,并且要求为非递减序列(即a<=b<=c)
输入描述 Input Description

第一行输入一个数n,第二行依次输入n个元素。

输出描述 Output Description
每一行输出一个不重复且满足a+b+c=0的序列。
样例输入 Sample Input

6
-1 0 1 2 -1 -4
样例输出 Sample Output
-1 0 1
-1 -1 2

[解题思路]

   用深度搜索即可,遍历数组S,找到a、b、c三个数相加等于0的序列 ,并把这个序列按字典序排列,通过STL里的sort即可,并判断是否重复,若不重复就是一个答案序列。下面的解法用的是vector容器,因为在排序,和判断是否重复的时候,用STL里的find和sort会方便很多。

[代码实现]

#include<iostream>
#include<vector>
#include<algorithm> 
using namespace std;
int S[101];     /* 存放数组 */
int Book[101];  /* 标记是否以用 */
int num;        /* 一共多少个元素 */
vector<int> Temp(3);    /* 存放三个元素a,b,c */
vector<vector<int>> ans;/* 存放所有符合条件的序列,用于判断是否重复 */

bool IsZero()  /* 判断是a+b+c==0 */
{
	int sum=0;
	for(vector<int>::iterator it=Temp.begin();it!=Temp.end();it++)
	{
		sum+=(*it);
	}
	if(sum == 0)
		return true;
	else
		return false;
}
bool IsRepeat()  /* 检查是否重复,另一种方法是全部存在一起,最后去重unique */
{
	std::sort(Temp.begin(),Temp.end());  /* 按字典序排序 */
	for(vector<vector<int>>::iterator it=ans.begin();it!=ans.end();it++)
	{
		if(Temp == (*it))      /* 如果重复直接返回false */
			return false;
	}
	ans.push_back(Temp);       /* 否则存入ans中 */
	return true;
}
void Print()
{
	for(vector<int>::iterator it=Temp.begin();it!=Temp.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
}
void Input()
{
	cin>>num;
	for(int i=0;i<num;i++)
		cin>>S[i];
}
int dfs(int step)
{
	if(step == 3)  /* a b c 三个数 */
	{
		if(IsZero() && IsRepeat())  /* 判断三个数之和是否为0和是否重复 */
		{
			Print(); /* 显示在屏幕上 */
		}
		return 0;
	}
	for(int i=0;i<num;i++)
	{
		if(!Book[i])
		{
			 Book[i] = 1;
			 Temp[step] = S[i];
             dfs(step + 1);
             Book[i] = 0;
		}
	}
}
int main()
{
	Input();
	dfs(0);
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值