Leetcode 849. 到最近的人的最大距离

发布时间 2023-08-22 20:24:45作者: 无聊的飞熊

题目描述

给你一个数组 seats 表示一排座位,其中 seats[i] = 1 代表有人坐在第 i 个座位上,seats[i] = 0 代表座位 i 上是空的(下标从 0 开始)。
至少有一个空座位,且至少有一人已经坐在座位上。
亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。
返回他到离他最近的人的最大距离。
** 示例1 **

** 示例2 **

代码

大佬链接
(自己还是没有思路啊,哭了,倒是能想到遍历,但后面还是没啥思路,可能多练练就好了,嗯,菜就多练练)

class Solution {
    public int maxDistToClosest(int[] seats) {
        int first = -1, last = -1;
        int d = 0, n = seats.length;
        for(int i=0;i<n;++i){
            if(seats[i] == 1){
                if(last != -1)
                {
                    d = Math.max(d, i - last);
                   
                }
                 if(first == -1)
                {
                    first = i;
                }
                last = i;
            }
        }
        return Math.max(d/2, Math.max(first, n - last - 1));
    }
}

思路

个人思路:

遍历确定各点(乘客)的位置,然后计算没两点之间距离,找大的,emm,我试试代码

class Solution {
    public int maxDistToClosest(int[] seats) {
        int n = seats.length, z = 0;
        int[] x = new int[n];
        for(int i = 0;i < n;i++){
            if(seats[i] == 1){
                x[z] = i;
                z++;
            }
        }
        intmax= x[z] - x[z-1];
        for(int i = z-1;i >= 0; i--){
            if(i >= 1){
                int y = x[i]-x[i-1];
                if(y > max){
                    max = y;
                }
            }
        }
        return max/2;
    }
}

啊,case1过了,但没考虑只有一个乘客的情况,多考虑考虑应该还是能写出来吧(我也很没信心,毕竟我从菜的一批,看着垃圾代码就知道了)

大神思路
啊,这里没什么好讲的啊,直接粘过来
我们定义两个变量 firstlast 分别表示第一个人和最后一个人的位置,用变量 d 表示两个人之间的最大距离。

然后遍历数组 seats,如果当前位置有人,如果此前 last 更新过,说明此前有人,此时更新 d=max⁡(d,i−last);如果此前 first 没有更新过,说明此前没有人,此时更新 first=i。接下来更新 last=i。

最后返回 max⁡(first,n−last−1,d/2)即可。

大佬不愧是大佬,思路清晰,代码简单!!