问题:给定多个可能重叠的区间,找出重叠区间的个数。
例如:
输入:[1,5],[10,15],[5,10],[20,30]
输出:3
时间复杂度O(nlogn) OC算法实现:
/**
6
*/
#import <Foundation/Foundation.h>
//区间点对象
@interface IntervalPoint : NSObject
@property (nonatomic,assign) int value;//值
@property (nonatomic,assign) int type;//类型 0-起点 1-终点
- (id)initWith:(int)value type:(int)type;
@end
//区间
@interface Interval : NSObject
@property (nonatomic, strong) IntervalPoint *startPoint;//起点
@property (nonatomic, strong) IntervalPoint *endPoint;//终点
- (id)initWith:(IntervalPoint *)startPoint endPoint:(IntervalPoint *)endPoint;
@end
@interface OverlapCount : NSObject
- (int)overlapCount:(NSArray *)pointArr;
@end
#import "OverlapCount.h"
@implementation IntervalPoint
- (id)initWith:(int)value type:(int)type
{
if ([super init]) {
self.value = value;
self.type = type;
}
return self;
}
@end
@implementation Interval
- (id)initWith:(IntervalPoint *)startPoint endPoint:(IntervalPoint *)endPoint
{
if ([super init]) {
self.startPoint = startPoint;
self.endPoint = endPoint;
}
return self;
}
@end
@implementation OverlapCount
- (int)overlapCount:(NSArray *)intervalArr
{
int max = 0;//最大重叠区间数
//将区间排序
NSMutableArray *unsortArr = [NSMutableArray array];
for (Interval *interval in intervalArr) {
[unsortArr addObject:interval.startPoint];
[unsortArr addObject:interval.endPoint];
}
NSArray *sortedArr = [unsortArr sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
IntervalPoint *point1 = (IntervalPoint *)obj1;
IntervalPoint *point2 = (IntervalPoint *)obj2;
if (point1.value > point2.value) {
return NSOrderedDescending;
}
if (point1.value < point2.value) {
return NSOrderedAscending;
}
return NSOrderedSame;
}];
//扫描升序数组
//遇到起点,重叠数加一,并记录最大值
//遇到终点,重叠书减一
int count = 1;
for (IntervalPoint *point in sortedArr) {
if (point.type == 0) {
count++;
if (count>max) {
max = count;
}
}
else
{
count--;
}
}
return max;
}
@end