剑指 Offer II 058. 日程表

164 阅读1分钟

剑指 Offer II 058. 日程表

代码实现

把this.arr数组中每一项数组简化为其start值,例如this.arr = [ [1,3] [3,5] ]简化为this.arr = [ 1 , 3 ],其中需要插入的值[2,4],简化为需要插入2,于是返回的index为1,如果满足了第一个数组end > 2,或者满足第二个数组的start < 4,则说明重叠了,于是返回false

var MyCalendar = function () {
  this.arr = [];
};
MyCalendar.prototype.findInsertIndex = function (start) {
  var left = 0;
  var right = this.arr.length - 1;
  while (left <= right) {
    var mid = left + ((right - left) >> 1);
    if (this.arr[mid][0] === start) {
      return mid;
    } else if (this.arr[mid][0] < start) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return left;
};

MyCalendar.prototype.book = function (start, end) {
  var index = this.findInsertIndex(start);
  if (
    (this.arr[index - 1] && start < this.arr[index - 1][1]) ||
    (this.arr[index] && end > this.arr[index][0])
  ) {
    return false;
  }
  this.arr.splice(index, 0, [start, end]);
  return true;
};

流程图分析

image.png