LeetCode每日一题|352. 将数据流变为多个不相交区间

142 阅读1分钟

题目描述

题目链接:leetcode-cn.com/u/cavetr/ image.png

思路分析

对于这道题,首先我们需要存储addNum加进来的数据,所以在创建对象即构造函数中需要一个数组来存储这些数据,而为了实现以不相交区间表示出所有的数据,我们可以试想,如果数组是有序的,那么只需要遍历一次,遇到不连续的值时,则多增加一个区间,所以在加入数据时,我们可以考虑每次加入数据后进行排序或是使用二分查找来保证数组的有序性,所以可以得到代码。 BP9H24M2WP3K4B7~%PEV6FF.png

代码

  • 函数写法

var SummaryRanges = function () {
  this.arr = [];
};

/** 
 * @param {number} val
 * @return {void}
 */
SummaryRanges.prototype.addNum = function (val) {
  //排序
  this.arr.push(val);
  this.arr.sort((a, b) => a - b);
  //二分
  /*
  let left = 0, right = this.arr.length - 1;
  let index = this.arr.length;
  while (left <= right) {
    let mid = left + ((right - left) >> 1);
    if (this.arr[mid] === val) {
        index = mid;
        break;
     }
    if (this.arr[mid] > val) {
      index = mid;
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  this.arr.splice(index, 0, val);
  */
};

/**
 * @return {number[][]}
 */
SummaryRanges.prototype.getIntervals = function () {
  let res = [];
  let resst = [this.arr[0]];
  for (let i = 1; i < this.arr.length; i++) {
    if (this.arr[i] > this.arr[i - 1] + 1) {
      resst.push(this.arr[i-1]);
      res.push(resst);
      resst=[this.arr[i]];
    }
  }
  resst.push(this.arr[this.arr.length-1]);
  res.push(resst);
  return res;
};

/**
 * Your SummaryRanges object will be instantiated and called as such:
 * var obj = new SummaryRanges()
 * obj.addNum(val)
 * var param_2 = obj.getIntervals()
 */
  • 类写法

class SummaryRanges {
  constructor() {
    this.arr = [];
  }
  addNum(val) {
    let left = 0, right = this.arr.length - 1;
    let index = this.arr.length;
    while (left <= right) {
      let mid = left + ((right - left) >> 1);
      if (this.arr[mid] === val) {
        index = mid;
        break;
      }
      if (this.arr[mid] > val) {
        index = mid;
        right = mid - 1;
      } else {
        left = mid + 1;
      }
    }
    this.arr.splice(index, 0, val);
  }
  getIntervals() {
    let res = [];
    let resst = [this.arr[0]];
    for (let i = 1; i < this.arr.length; i++) {
      if (this.arr[i] > this.arr[i - 1] + 1) {
        resst.push(this.arr[i - 1]);
        res.push(resst);
        resst = [this.arr[i]];
      }
    }
    resst.push(this.arr[this.arr.length - 1]);
    res.push(resst);
    return res;
  }
}