leetcode849. 到最近的人的最大距离

题目:

题解:

(一)直接搜索:

<1>遍历一次seats数组,找到所有空座位对应编号保存在empty数组,非空座位编号保存在notempty数组
<2>对每个空座位进行搜索,将其他已经有人的座位与该座位距离保存在dis中,找到最小距离mindis,更新maxdis
def maxDistToClosest(self, seats):
    lenseats = len(seats)
    empty = []
    notempty = []
    maxdis = float("-inf")
    for i in range(lenseats):
        if seats[i]==0:
            empty.append(i)
        else:
            notempty.append(i)

    for j in range(len(empty)):
        dis = []
        for k in range(len(notempty)):
            dis.append(abs(empty[j]-notempty[k]))
        mindis = min(dis)
        maxdis = max(maxdis,mindis)
    return maxdis

测试结果通过,但提交超时了:

(二)参考https://www.jianshu.com/p/6f1e8121e780

亚历克斯可以坐的位置的距离分三种情况:

<1>左边有座位为空,坐在第一个位置,最小距离为第一个人坐的位置

<2>右边有空位,坐在最后一个位置,最小距离为与最右边有人的座位的距离

<3>左右两端都没有空位,只能坐在两个有人的座位之间,坐在两人最中间的位置会使最小距离最大化

最终可以得到的最大化的最小距离是以上三种情况的最大值

class Solution(object):

    def maxDistToClosest(self, seats):

        lenseats = len(seats)

        person = []

        for i in range(lenseats):

            if seats[i]==1:

                person.append(i)

        dis1 = person[0]

        dis2 = lenseats-person[-1]-1

        dis3 = 0

        for j in range(len(person)-1):

            dis3 = max(int(abs(person[j]-person[j+1])//2),dis3)

        maxdis = max(dis1,dis2,dis3)

        return maxdis

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值