You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化「到最近的人的最大距离」问题的实现代码?

问题描述

给定一个代表一排座位的数组,其中seats[i] = 1表示第i个座位有人就座,seats[i] = 0表示该座位为空(下标从0开始)。数组中至少有一个空座位和一个有人的座位。

Alex希望坐在一个座位上,使得他与最近的人的距离最大化。返回这个最大距离。

现有代码
import math
class Solution(object):
    def maxDistToClosest(self, seats):
        left_max = 0
        right_max = 0
        if seats[0] == 0:
            i=0
            while seats[i] == 0:
                left_max+=1
                i+=1

        if seats[len(seats)-1] == 0:
            j=len(seats)-1
            while seats[j] == 0:
                right_max+=1
                j-=1
        curr_count=0
        max_count=0
        for i, value in enumerate(seats):
            if value ==0:
                curr_count+=1
            if value == 1 and curr_count !=0:
                max_count = max(curr_count, max_count)
                curr_count = 0

        a = max(left_max, right_max)
        b = (max_count+1)/2
        #print(right_max)
        #print(b, max_count, right_max)
        return max(int(b), a)

solution = Solution()
arr = [1,0,0,0,1,0,1]
a = solution.maxDistToClosest(arr)
print("Output:", a) #expected output 2

arr = [1,0,0,0]
a = solution.maxDistToClosest(arr)
print("Output:", a) #expected output 3

arr = [0,1]
a = solution.maxDistToClosest(arr)
print("Output:", a) #expected output 1

arr = [1,0,0,0,0,1,0,0,0,1]
a = solution.maxDistToClosest(arr)
print("Output:", a) #expecte output 2

上述代码可正常运行,但实现方式较为朴素。请问能否对其进行优化,提升可读性或减少多余的循环与逻辑?

优化方案

原代码用了三次遍历(左前缀空段、右后缀空段、中间空段统计),可以合并为一次遍历完成所有计算,同时让逻辑更紧凑易读。核心思路是跟踪上一个有人座位的位置,遍历过程中实时计算当前空段的最大距离,同时处理首尾的特殊情况。

优化后的代码如下:

class Solution:
    def maxDistToClosest(self, seats):
        max_dist = 0
        last_occupied = -1  # 初始值表示还未遇到有人的座位
        n = len(seats)
        
        for i, seat in enumerate(seats):
            if seat == 1:
                # 处理开头的空段:从数组起点到第一个有人座位的距离
                if last_occupied == -1:
                    max_dist = i
                else:
                    # 中间空段的最大距离是两段中点到最近的人的距离
                    max_dist = max(max_dist, (i - last_occupied) // 2)
                last_occupied = i
        
        # 处理结尾的空段:从最后一个有人座位到数组终点的距离
        max_dist = max(max_dist, n - 1 - last_occupied)
        
        return max_dist

# 测试用例
solution = Solution()
arr = [1,0,0,0,1,0,1]
print("Output:", solution.maxDistToClosest(arr)) # 预期输出 2

arr = [1,0,0,0]
print("Output:", solution.maxDistToClosest(arr)) # 预期输出 3

arr = [0,1]
print("Output:", solution.maxDistToClosest(arr)) # 预期输出 1

arr = [1,0,0,0,0,1,0,0,0,1]
print("Output:", solution.maxDistToClosest(arr)) # 预期输出 2

优化点说明

  • 减少遍历次数:从三次遍历变为一次遍历,时间复杂度仍为O(n),但实际运行效率更高
  • 逻辑更简洁:通过last_occupied变量跟踪上一个有人座位的位置,无需单独处理首尾的空段循环
  • 可读性提升:变量命名更直观,逻辑流程清晰,每个分支的作用明确
  • 避免冗余计算:实时更新最大距离,无需额外存储中间空段的长度

内容的提问来源于stack exchange,提问作者Karina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:03:22