1. 程式人生 > >LeetCode 849題 到最近的人的最大距離 -- JavaScript

LeetCode 849題 到最近的人的最大距離 -- JavaScript

題目描述:

在一排座位( 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. 1 <= seats.length <= 20000
  2. seats 中只含有 01,至少有一個 0,且至少有一個 1

方法分析:

這道題就是找0的個數,也就是找空座位數。我們要找到最大連續空座位數。對於最大連續空座,有兩種情況:

  1. 最大連續空座數在兩個1之間
  2. 最大連續空座數在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的一半且向上取整值就可以了。

該演算法的時間複雜度為\small O(n)

該演算法的空間複雜度為\small O(n)