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

题目:

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

至少有一个空座位,且至少有一人坐在座位上。

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

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

示例 1:

输入:[1,0,0,0,1,0,1]
输出:2
解释:
如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。
如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1 。
因此,他到离他最近的人的最大距离是 2 。 
示例 2:

输入:[1,0,0,0]
输出:3
解释: 
如果亚历克斯坐在最后一个座位上,他离最近的人有 3 个座位远。
这是可能的最大距离,所以答案是 3 。
提示:

1 <= seats.length <= 20000
seats 中只含有 01,至少有一个 0,且至少有一个 1
class Solution {
public:
    int maxDistToClosest(vector<int>& seats) {
        int n = seats.size();
        int res = 0;
        int sit = 0;
        
        vector<int> left(n,0);
        vector<int> right(n,0);
        
        /*left*/
        int flag = -1;
        left[0] = -1;
        for(int i = 1;i < n;++i){
            if(seats[i-1]){
                flag = i-1;
            }
            if(flag >= 0){
                left[i] = i - flag;
            }else{
                left[i] = -1;
            }
            //cout<<left[i]<<",";
        }
        //cout<<endl;
        
        /*right*/
        flag = -1;
        right[n-1] = -1;
        for(int i = n-2 ;i >= 0; --i){
            if(seats[i+1]){
                flag = i+1;
            }
            
            if(flag >= 0){
                right[i] = flag - i;
            }else{
                right[i] = -1;
            }
            //cout<<right[i]<<",";
        }
        //cout<<endl;
        
        for(int i = 0;i < n; ++i){
            if(seats[i] == 0){
                int distance = 20001;
                if(left[i] > 0){
                    distance = min(left[i],distance);
                }
                if(right[i] > 0){
                    distance = min(right[i],distance);
                }
                if(distance < 20001){
                    res = max(res,distance);
                }
            }
        }
        
        return res;
    }
};
原文地址:https://www.cnblogs.com/mikemeng/p/9185500.html