【算法笔记】【LeetCode】 [986] 区间列表的交集

124 阅读1分钟

【算法笔记】系列文章用于作为个人算法思考及错题集使用,仅供参考,欢迎交流。


根据题解优化:

/*
 * @lc app=leetcode.cn id=986 lang=javascript
 *
 * [986] 区间列表的交集
 */

// @lc code=start
/**
 * @param {number[][]} firstList
 * @param {number[][]} secondList
 * @return {number[][]}
 */
var intervalIntersection = function (firstList, secondList) {
  let result = [];
  let i = 0,
    j = 0;
  while (i < firstList.length && j < secondList.length) {
    //下面两行为第一次更改,发现用时较多,后来想到似乎Math的max和min方法都会比较耗时,于是直接改用了原始的比较,果然时间快了许多。
    //let low = Math.max(firstList[i][0], secondList[j][0]);
    //let high = Math.min(firstList[i][1], secondList[j][1]);
    let low = firstList[i][0] >= secondList[j][0] ? firstList[i][0] : secondList[j][0];
    let high = firstList[i][1] <= secondList[j][1] ? firstList[i][1] : secondList[j][1];
    if (low <= high) {
      result.push([low, high]);
    }
    firstList[i][1] >= secondList[j][1] ? j++ : i++;
  }
  return result;
};

// @lc code=end

以下是陈旧思维的第一次解题,一些思路和方向错误,导致了很多错误,比如:

  1. 循环条件错误,导致内存溢出。
  2. 由1导致的边界处理问题,导致遗漏。
  3. 由于没有找到正确思路而导致的问题复杂化。

错误示例:

/*
 * @lc app=leetcode.cn id=986 lang=javascript
 *
 * [986] 区间列表的交集
 */

// @lc code=start
/**
 * @param {number[][]} firstList
 * @param {number[][]} secondList
 * @return {number[][]}
 */
var intervalIntersection = function (firstList, secondList) {
  let result = [];
  let i = 0,
    j = 0;
  let xStart;
  let xEnd;
  let yStart;
  let yEnd;
  let fLen = firstList.length;
  let sLen = secondList.length;
  //思维错误,最开始认为需要把每个数组的每个区间都遍历到,用了或运算,
  //导致了很多异常,但是后来看了题解意识到,如果某个数组超出了很多区间,而另外一个数组没有那么多,
  //直接结束循环即可,因为他们不可能再有交集。
  //🤔那如果是求并集,应该就需要遍历所有区间了吧?
  while (i < fLen || j < sLen) {
    xStart = firstList[i < fLen ? i : fLen - 1][0];
    xEnd = firstList[i < fLen ? i : fLen - 1][1];
    yStart = secondList[j < sLen ? j : fLen - 1][0];
    yEnd = secondList[j < sLen ? j : fLen - 1][1];
   // 思维差距,根据题解,只需要通过max和min函数,即可确定区间,而不用分开判断和考虑
    if (yStart >= xStart && yStart <= xEnd) {
      result.push([yStart, xEnd]);
      if (i < fLen) {
        i++;
      }
      continue;
    }
    if (xStart >= yStart && xStart <= yEnd) {
      result.push([xStart, yEnd]);
      if (j < sLen) {
        j++;
      }
      continue;
    }
    xEnd >= yEnd
      ? j < secondList.length - 1 && j++
      : i < firstList.length - 1 && i++;
  }
  return result;
};

// @lc code=end

总结:多做,多想,见的多了,思路就宽了。