如何优化「到最近的人的最大距离」问题的实现代码?
问题描述
给定一个代表一排座位的数组,其中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
相关产品推荐
相关产品推荐

