[LeetCode] 849. Maximize Distance to Closest Person 離最近的人的最大距離



In a row of seats1 represents a person sitting in that seat, and 0 represents that the seat is empty. html

There is at least one empty seat, and at least one person sitting.git

Alex wants to sit in the seat such that the distance between him and the closest person to him is maximized. github

Return that maximum distance to closest person.數組

Example 1:指針

Input: [1,0,0,0,1,0,1]
Output: 2
Explanation:
If Alex sits in the second open seat (seats[2]), then the closest person has distance 2.
If Alex sits in any other open seat, the closest person has distance 1.
Thus, the maximum distance to the closest person is 2.

Example 2:code

Input: [1,0,0,0]
Output: 3
Explanation:
If Alex sits in the last seat, the closest person is 3 seats away.
This is the maximum distance possible, so the answer is 3.

Note:htm

  1. 1 <= seats.length <= 20000
  2. seats contains only 0s or 1s, at least one 0, and at least one 1.



這道題給了咱們一個只有0和1且長度爲n的數組,表明n個座位,其中0表示空座位,1表示有人座。如今說是愛麗絲想找個位置坐下,可是但願能離最近的人越遠越好,這個不難理解,就是想左右兩邊儘可能跟人保持距離,讓咱們求這個距離最近的人的最大距離。來看題目中的例子1,有三個空位連在一塊兒,那麼愛麗絲確定是坐在中間的位置比較好,這樣跟左右兩邊人的距離都是2。例子2有些特別,當空位連到了末尾的時候,這裏能夠想像成靠牆,那麼靠牆坐確定離最遠啦,因此例子2中愛麗絲坐在最右邊的位子上距離左邊的人距離最遠爲3。那麼不難發現,愛麗絲確定須要先找出最大的連續空位長度,若連續空位靠着牆了,那麼就直接挨着牆坐,若兩邊都有人,那麼就坐到空位的中間位置。如何能快速知道連續空位的長度呢,只要知道了兩邊人的位置,相減就是中間連續空位的個數。因此博主最早使用的方法是用一個數組來保存全部1的位置,即有人坐的位置,而後用相鄰的兩個位置相減,就能夠獲得連續空位的長度。固然,靠牆這種特殊狀況要另外處理一下。當把全部1位置存入數組 nums 以後,開始遍歷 nums 數組,第一我的的位置有可能不靠牆,那麼他的位置座標就是他左邊靠牆的連續空位個數,直接更新結果 res 便可,由於靠牆連續空位的個數就是離右邊人的最遠距離。而後對於其餘的位置,咱們減去前一我的的位置座標,而後除以2,更新結果 res。還有最右邊靠牆的狀況也要處理一下,就用 n-1 減去最後一我的的位置座標,而後更新結果 res 便可,參見代碼以下:blog



解法一:leetcode

class Solution {
public:
    int maxDistToClosest(vector<int>& seats) {
        int n = seats.size(), res = 0;
        vector<int> nums;
        for (int i = 0; i < n; ++i) {
            if (seats[i] == 1) nums.push_back(i);
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (i == 0) res = max(res, nums[0]);
            else res = max(res, (nums[i] - nums[i - 1]) / 2);
        }
        if (!nums.empty()) res = max(res, n - 1 - nums.back());
        return res;
    }
};



咱們也能夠只用一次遍歷,那麼就須要在遍歷的過程當中統計出連續空位的個數,即連續0的個數。那麼採用雙指針來作,start 指向連續0的起點,初始化爲0,i爲當前遍歷到的位置。遍歷 seats 數組,跳過0的位置,當遇到1的時候,此時先判斷下 start 的值,如果0的話,代表當前這段連續的空位是靠着牆的,因此要用連續空位的長度 i-start 來直接更新結果 res,不然的話就是兩頭有人的中間的空位,那麼用長度加1除以2來更新結果 res,此時 start 要更新爲 i+1,指向下一段連續空位的起始位置。for 循環退出後,仍是要處理最右邊靠牆的位置,用 n-start 來更新結果 res 便可,參見代碼以下:get



解法二:

class Solution {
public:
    int maxDistToClosest(vector<int>& seats) {
        int n = seats.size(), start = 0, res = 0;
        for (int i = 0; i < n; ++i) {
            if (seats[i] != 1) continue;
            if (start == 0) res = max(res, i - start);
            else res = max(res, (i - start + 1) / 2);
            start = i + 1;
        }
        res = max(res, n - start);
        return res;
    }
};



討論:這道題的一個很好的 follow up 是讓咱們返回愛麗絲坐下的位置,那麼要在結果 res 能夠被更新的時候,同時還應該記錄下連續空位的起始位置 start,這樣有了 start 和 最大距離 res,那麼就能夠定位出愛麗絲的座位了。



Github 同步地址:

https://github.com/grandyang/leetcode/issues/849



相似題目:

Exam Room



參考資料:

https://leetcode.com/problems/maximize-distance-to-closest-person/

https://leetcode.com/problems/maximize-distance-to-closest-person/discuss/137912/C%2B%2BJava-1-Pass-Solution


LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索