重叠区间个数

来源:互联网 发布:黑客python 编辑:程序博客网 时间:2024/05/17 07:36

问题:给定多个可能重叠的区间,找出重叠区间的个数。

例如:

输入:[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


0 0
原创粉丝点击