找到最近的Boss算法题

该博客介绍了一个算法问题,即如何在层级关系中找到两个人最近的共同上级。通过递归方法,从顶层开始向下搜索,判断当前管理者是否包含任一成员或两者都在同一分支上,最终找到最近的共同上级。

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

//层级关系,任意给两个元素,找到最近的、公共的上一级

              boss

  membera1  members  membera3

memberb1    memberb2   




#import "ViewController.h"


@interface ViewController ()

@property (nonatomic,strong)NSArray *Bill;


@property (nonatomic,strong)NSArray *Dom;

@property (nonatomic,strong)NSArray *Samir;

@property (nonatomic,strong)NSArray *Michael;


@property (nonatomic,strong)NSArray *Bob;

@property (nonatomic,strong)NSArray *Peter;

@property (nonatomic,strong)NSArray *Porter;

@property (nonatomic,strong) NSArray *Flisa;



@property (nonatomic,strong)NSArray *Milton;

@property (nonatomic,strong)NSArray *Nina;


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    //每个数组代表一个人,数组内包含它的下属,

#pragma mark: 注意:数组的第一个元素是自己的名字,遍历数组时,从 i=1开始

    

    //最底层

    self.Nina =@[@"Nina"];

    self.Milton =@[@"Milton"];


    //上一层

    self.Bob =@[@"Bob"];

    self.Peter =@[@"Peter",self.Nina,self.Milton];

    self.Porter =@[@"Porter"];

    self.Flisa =@[@"Flisa"];


    //上一层

    self.Dom =@[@"Dom",self.Bob,self.Peter,self.Porter];

    self.Samir =@[@"Samir"];    

    self.Michael =@[@"Michael",self.Flisa];


    //最顶层

    self.Bill =@[@"Bill",self.Dom,self.Samir,self.Michael];

    

    


   //从顶层开始往下检索,第一次调用这个方法时,HigerManager参数必须用 self.Bill

   NSArray *closest = [selfclosestCommonManagerByMember1:self.NinaMember2:self.MichaelHigherManager:self.Bill];

   

    //打印名字,看结果是否正确

    NSLog(@"%@", closest.firstObject);


}


#pragma mark:执行这个方法

- (NSArray *)closestCommonManagerByMember1:(NSArray *)member1 Member2:(NSArray *)member2 HigherManager:(NSArray *)manager{


    BOOL contains1 = [manager containsObject:member1];

    BOOL contains2 = [manager containsObject:member2];

    

    BOOL special1 = [selfmanager:member1containsMember:member2];

    BOOL special2 = [selfmanager:member2containsMember:member1];

   

    

    

    if (special1) {

        return member1;

        

    }

    if (special2) {

        return member2;

    }

    

    //manager至少直接包含其中一个(只是父子关系),两个member不存在包含关系

    if (contains1 || contains2) {

            return manager;

        

    }

    

    //manager两个都不直接包含

    for (int i=1; i<manager.count; i++) {

        BOOL containsForPath1 = [selfmanager:manager[i]containsMember:member1];

        BOOL containsForPath2 = [selfmanager:manager[i]containsMember:member2];

        //两个member都不在这条分支上

        if (!containsForPath1 && !containsForPath2) {

            continue;

        }

        //两个member都在这条分支上

        if (containsForPath1 && containsForPath2) {

          return [selfclosestCommonManagerByMember1:member1Member2:member2HigherManager:manager[i]];

        }

        

        //只有一个member在这条分支上

        return manager;

        

    }

   

    return nil;

}



//判断 manager当中是否包含 member,member可以是manager的儿子,也可以是孙子,也可以是重孙子.....

- (BOOL)manager:(NSArray *)manager containsMember:(NSArray *)member {

    if (manager.count <=1) {

        return false;

    }

    if ([manager containsObject:member]) {

        return true;

    }

 

    BOOL contains = false;

    for (int i=1; i<manager.count; i++) {

        contains = contains || [self manager:manager[i] containsMember:member];

    }

    return contains;

    

}




@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值