LeetCode 849题 到最近的人的最大距离 -- JavaScript

博客围绕LeetCode题目“到最近的人的最大距离”展开。题目是在一排座位中,找到能使Alex与最近的人距离最大化的座位。方法是找最大连续空座位数,分在两个1之间和1两侧两种情况。代码实现先获取连续0数组,再处理最大连续0数,给出了时间和空间复杂度。

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

题目描述:

在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。至少有一个空座位,且至少有一人坐在座位上。

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

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

示例 :

输入:[1,0,0,0,1,0,1]
输出:2
解释:如果Alex坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。
     如果Alex坐在其它任何一个空位上,他到离他最近的人的距离为 1 。因此,他到离他最近的人的最大距离是 2 。 
输入:[1,0,0,0]
输出:3
解释: 如果Alex坐在最后一个座位上,他离最近的人有 3 个座位远。这是可能的最大距离,所以答案是 3 。 

提示:

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

方法分析:

这道题就是找0的个数,也就是找空座位数。我们要找到最大连续空座位数。对于最大连续空座,有两种情况:

  1. 最大连续空座数在两个1之间
  2. 最大连续空座数在1两侧。如果在1的左侧,就让他坐在首位;如果在1的右侧,就让他坐在末位。

代码实现:

var maxDistToClosest = function(seats) {
  let len = seats.length;
  let count0 = 0;
  let arr0 = [];
  //获得所有的连续的0
  for (var i = 0; i < len; i++) {
    if(seats[i] == 0){
      count0++;
    }else{
      arr0.push(count0);
      count0 = 0;
    }
  }
  //获取数组末尾一段连续的0数
  arr0.push(count0);
  //得到最大连续0数
  let max = Math.max(...arr0);
  let len0 = arr0.length;
  //处理首尾没人坐的情况
  if(seats[0] == 0 || seats[len - 1] == 0) 
    return Math.max(arr0[0], Math.ceil(max / 2), arr0[len0 - 1]);
  return Math.ceil(max / 2);
};

代码解析:

该函数的前半部分是获取所有的连续0构成的一个数组。遍历seats,为0时count0加1,否则记录下获取到的count0并重置count0为0。需要注意的是,seats中最后一个1之后的连续0数并没有并添加,所以当遍历完成,还需要把最后一段的count0添加到数组中。

该函数的后半部分就是寻找并处理最大连续0数。首先得到数组中的最大连续0数,然后判断。如果首尾没人坐的话,我们就需要取得首段连续0、最大连续0的一半且向上取整、末端连续0的最大值;否则的话,直接返回最大连续0的一半且向上取整值就可以了。

该算法的时间复杂度为\small O(n)

该算法的空间复杂度为\small O(n)

参考链接:https://leetcode-cn.com/problems/maximize-distance-to-closest-person/description/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值