1. 程式人生 > >Leetcode 849 到最近的人的最大距離

Leetcode 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. 1 <= seats.length <= 20000
  2. seats 中只含有 0 和 1,至少有一個 0,且至少有一個 1

演算法:

1. 建立一個新陣列,在兩頭加上1作為哨兵,求出這個新陣列的最長連續0的大小len,顯然,答案應該是(len+1)/2

2.如果兩頭沒人坐的話,特別處理之,求出兩頭連續0的最大長度,最終答案應該是max(1中的答案,兩頭連續0的最大長度)

程式碼:

class Solution {
public:
    int maxDistToClosest(vector<int>& seats) 
    {
        vector<int> new_seats;//左右兩邊都算成1,統一規劃
        new_seats.push_back(1);
        for(int i=0;i<seats.size();i++)
            new_seats.push_back(seats[i]);
        new_seats.push_back(1);

        int max_jiange=-1,temp=0;//求出最大的連續0長度
        for(int i=0;i<new_seats.size();i++)
        {
            if(new_seats[i]==0)
                temp++;
            else
            {
                max_jiange = max(max_jiange,temp);
                temp = 0;
            }
        }
        
        if(seats[0]!=0 && seats[seats.size()-1]!=0)//不涉及到可能是坐在兩頭的情況
            return int((max_jiange+1)/2);
        else
        {
            int left_maxlen=0,right_maxlen=0;
            int pos=0;
            while(seats[pos]==0)    {pos++;left_maxlen++;}
            pos=seats.size()-1;
            while(seats[pos]==0)    {pos--;right_maxlen++;}
            return max(int((max_jiange+1)/2),max(left_maxlen,right_maxlen));
        }
    }
};