LeetCode Merge Intervals

本文探讨了在C++中使用vector容器与自定义结构体进行排序时遇到的问题及解决方案,重点介绍了重载结构体中的()操作符以实现正确排序,并提供了一个用于合并区间的方法,同时比较了不同排序方法的效率。

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

这题最头疼的是如何给vector中的结构体排序,重载sort中自己的编写的排序函数不行,重载小于操作符不行,后来看人家的,是重载结构体中的()操作符的,可以了,之后没什么,不知道有没有O(n)的方法

// LeetCode_MergeIntervals.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


struct Interval {
	    int start;
	    int end;
	    Interval() : start(0), end(0) {}
	    Interval(int s, int e) : start(s), end(e) {}
		bool operator<(const Interval &itv2) const
		{
			return start < itv2.start;
		}		
	};
/*
bool operator <(const Interval &itv1,const Interval &itv2)
{
	return itv1.start < itv2.start;
}

bool compare_lessthan(const Interval &itv1,const Interval &itv2)
{
	return itv1.start < itv2.start;
}*/
struct comp  
{  
	bool operator()(const Interval& lhs, const Interval& rhs) const  
	{  
		if(lhs.start != rhs.start) return lhs.start < rhs.start;  
		else return lhs.end < rhs.end;  
	}  
};
vector<Interval> merge(vector<Interval> &intervals) {
	vector<Interval> ret;
	int len = intervals.size();
	if(len==0)
		return ret;
	sort(intervals.begin(),intervals.end(),comp());//sort(intervals.begin(),intervals.end());//sort(intervals.begin(),intervals.end(),compare_lessthan);
	int startLast = intervals[0].start,endLast = intervals[0].end;
	for (int i=1;i<len;i++)
	{
		if (intervals[i].start<=endLast)
		{
			endLast = intervals[i].end > endLast? intervals[i].end:endLast;
		}
		else
		{
			Interval temp(startLast,endLast);
			ret.push_back(temp);
			startLast = intervals[i].start;
			endLast = intervals[i].end;
		}
	}
	Interval temp2(startLast,endLast);
	ret.push_back(temp2);
	return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
	vector<Interval> itvs;
	int start,end;
	while(cin>>start&&cin>>end)
	{
		Interval itvl(start,end);
		itvs.push_back(itvl);
	}
	vector<Interval> ret;
	ret = merge(itvs);
	vector<Interval>::iterator iter = itvs.begin();
	while(iter!=itvs.end())
	{
		cout<<iter->start<<" "<<iter->end<<endl;
		iter++;
	}
	cout<<endl;
	vector<Interval>::iterator iter2 = ret.begin();
	while(iter2!=ret.end())
	{
		cout<<iter2->start<<" "<<iter2->end<<endl;
		iter2++;
	}
	system("pause");
	return 0;
}
网上说的有插入的做法,说是 类似于插入排序的思想 http://blog.youkuaiyun.com/ybhou/article/details/9397329  自己试了一下,他这程序的运行时间要更长。所以没怎么看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值