【算法笔记】系列文章用于作为个人算法思考及错题集使用,仅供参考,欢迎交流。
根据题解优化:
/*
* @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导致的边界处理问题,导致遗漏。
- 由于没有找到正确思路而导致的问题复杂化。
错误示例:
/*
* @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
总结:多做,多想,见的多了,思路就宽了。