算法例题整理02-数组leecode849

  1. 到最近的人的最大距离
    在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。

至少有一个空座位,且至少有一人坐在座位上。

亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。

返回他到离他最近的人的最大距离。

示例 1:

输入:[1,0,0,0,1,0,1]
输出:2
解释:
如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。
如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1 。
因此,他到离他最近的人的最大距离是 2 。

示例 2:

输入:[1,0,0,0]
输出:3
解释:
如果亚历克斯坐在最后一个座位上,他离最近的人有 3 个座位远。
这是可能的最大距离,所以答案是 3 。
提示:

1 <= seats.length <= 20000
seats 中只含有 0 和 1,至少有一个 0,且至少有一个 1。

######## 这是我自己做的 主要记录0之前1的位置 和1之前0的位置 两个相减

class Solution:
    def maxDistToClosest(self, seats: List[int]) -> int:
        loc = {}
        loc1,loc2 = [],[]
        n = len(seats)
        temp=0
        for i,state in enumerate(seats):
            loc[i] = state
        for i in range(n-1):
            if (loc[i] == 1) & (loc[i+1] == 0): #注意 在oj里面尽量用and
                loc1.append(i)
            if (loc1 !=[])&(loc[i] == 0) & (loc[i+1] == 1): #在第一个loc1有值,即出现1了之后使用该情况下的算法,计算loc2
                loc2.append(i)
        if (loc1!=[])&(loc2!=[]):
            temp = int((max(list(map(lambda x,y:abs(y-x),loc1,loc2)))+1)/2)
        dis = max(temp,seats.index(1),seats[::-1].index(1)) #这里考虑前后两端为零的情况,使用index正着,倒着找
        return dis

执行用时 :172 ms, 在所有 Python3 提交中击败了41.10%的用户

内存消耗 :15.5 MB, 在所有 Python3 提交中击败了5.00%的用户

官方答案:
这个是给出的使用分组的答案 可以看一下这个函数itertools.groupby

class Solution(object):
    def maxDistToClosest(self, seats):
        ans = 0
        for seat, group in itertools.groupby(seats):
            if not seat:
                K = len(list(group))
                ans = max(ans, (K+1)/2)


        return int(max(ans, seats.index(1), seats[::-1].index(1)))

执行用时 :148 ms, 在所有 Python3 提交中击败了84.79%的用户
内存消耗 :13.7 MB, 在所有Python3提交中击败了59.38%的用户

import itertools
seats = [1,0,0,0,1,1,0,0,1]
for seat, group in itertools.groupby(seats):        
    print(seat,list(group))

1 [1]
0 [0, 0, 0]
1 [1, 1]
0 [0, 0]
1 [1]

官方

class Solution(object):
    def maxDistToClosest(self, seats):
        N = len(seats)
        left, right = [N] * N, [N] * N


        for i in range(N):
            if seats[i] == 1: left[i] = 0
            elif i > 0: left[i] = left[i-1] + 1   #记录从左往右,距离每个有座位的距离


        for i in range(N-1, -1, -1):
            if seats[i] == 1: right[i] = 0
            elif i < N-1: right[i] = right[i+1] + 1   #记录从右往左,距离每个有座位的距离


        return max(min(left[i], right[i])
                   for i, seat in enumerate(seats) if not seat)   #取他们距离有座位置的最小值,取所有最小值中的最大值

执行用时 :180 ms, 在所有 Python3 提交中击败了32.36%的用户

right:
[0, 3, 2, 1, 0, 8, 7]
left:
[0, 1, 2, 3, 0, 1, 2]

############只考虑有座的人

class Solution(object):
    def maxDistToClosest(self, seats):
        """
        :type seats: List[int]
        :rtype: int
        """
        length = len(seats)
        turn = []
        # 把有人坐的座位下标提出来
        for i in range(length):
            if seats[i] == 1:
                turn.append(i)
        # 考虑最左最右是零的情况
        ans = max(turn[0], length-turn[-1]-1)
        # 离他最近的人的最大距离即相邻有人坐的座位之间距离的一半
        for i in range(0, len(turn)-1):
            if (turn[i+1] - turn[i])/2 > ans:
                ans = (turn[i+1] - turn[i]) / 2
        return ans


作者:iera
链接:https://leetcode-cn.com/problems/maximize-distance-to-closest-person/solution/pythonhen-hao-li-jie-de-fang-fa-by-iera/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

执行用时 :160 ms, 在所有 Python3 提交中击败了69.88%的用户
内存消耗 :14.4 MB, 在所有Python3提交中击败了5.26%的用户

后两种方法思路都挺好的
需要关注一下哦!

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-distance-to-closest-person
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值