C++ 【对若干个区间进行合并】

该博客介绍了如何使用C++解决对多个区间进行合并的问题,重点在于处理区间重叠部分,实现有效的合并策略。
摘要由CSDN通过智能技术生成

最近遇到测试结果区域重叠,如test1=0005.png ,C,1  200, 157  345,520  700. 第一区间和第二区间部分重

叠。  参考博客:http://blog.csdn.net/bupt8846/article/details/42738739

#include <vector>
#include <algorithm>
//第一步,这里定义一个类,同时声明了类结构;
class Interval
{
public:
	int left, right;
	bool isleftclosed, isrightclosed;
	Interval(const int &a, const int &b, const bool l, const bool r) :left(a), right(b), isleftclosed(l), isrightclosed(r){};  //新定义的结构体属性; 如[a,b,1,1],(a,b,0,0)
	bool operator<(const Interval &a)
	{
		if (left != a.left)
			return left<a.left;
		else if (isleftclosed != a.isleftclosed)
			return isleftclosed;
		else
		{
			if (right != a.right)
				return right<a.right;
			else if (isrightclosed != a.isrightclosed)
				return isrightclosed;
			else
				return false;//相等的时候返回假  
		}
	}

};


//第二步,声明区间合并函数。调用这个函数实现,区间合并,且得到的是顺序结果。
vector<Interval> union_intervals(vector<Interval>  A)
{
	if (A.size() <= 1)
		return A;
	sort(A.begin(), A.end()); //sort函数的头文件,#include <algorithm>
	vector<Interval> res;
	Interval cur = A[0];
	for (int i = 0; i<A.size(); i++)
	{
		//两个if语句的逻辑关系要理清楚  
		if (A[i].left<cur.right || (A[i].left == cur.right && (A[i].isleftclosed || cur.isrightclosed)))
		{
			if (A[i].right>cur.right || (A[i].right == cur.right && A[i].isrightclosed))//不要忘了!  
				cur.right = A[i].right;
		}
		else
		{
			res.push_back(cur);
			cur = A[i];
		}
	}
	res.push_back(cur);//不要忘了!  
	return res;
}

//第三步,调用上述函数 vector<Interval> union_intervals(vector<Interval>  A)实现区间合并。
vector<Interval> A, B;//输入A和输出B
for (int kg = 0; kg < 10; kg++)
{
	Interval QA(tempstr[2 * kg], tempstr[2 * kg + 1], 1, 0);//tempstr[]为输入的数据
 	A.push_back(QA);
}
B = union_intervals(A);
for (int kg = 0; kg < B.size(); kg++)
{
Comtp[2 * kg] = B.at(kg).left;
Comtp[2 * kg + 1] = B.at(kg).right;//Comtp中为合并后的有序区间。
}		


vector 类型的数据参考:http://blog.csdn.net/hancunai0017/article/details/7032383

C++ 【对若干个区间进行合并】



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值