版权声明:版权所有,转载、引用请指明出处! https://blog.csdn.net/qq_30216191/article/details/82081307
题目描述:
在一排座位( 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 <= seats.length <= 20000
seats
中只含有 0 和 1,至少有一个0
,且至少有一个1
。
方法分析:
这道题就是找0的个数,也就是找空座位数。我们要找到最大连续空座位数。对于最大连续空座,有两种情况:
- 最大连续空座数在两个1之间
- 最大连续空座数在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的一半且向上取整值就可以了。
该算法的时间复杂度为
该算法的空间复杂度为
参考链接:https://leetcode-cn.com/problems/maximize-distance-to-closest-person/description/