3.4 56.合并区间
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
我的思路:
- 什么时候能够合并?
- 在左值升序的情况下,答案数组的右值大于当前数组的左值
- 这个时候将右值更新为两者的最大值
- 放入答案数组
代码如下:
let len = intervals.length;
// 将原数组中的第一个放进去
let ans : number[][] = [intervals[0]];//Line 4: Char 22: error TS1011: An element access expression should take an argument.
// 对原数组进行排序
intervals = intervals.sort((a , b) => a[0] - b[0]);//排序不完善
// 遍历进行合并
for(let j = 1 ; j < len ; j++){
// 每次比较是要把答案数组中的最后一个的右值与当前数组的左值进行比较
// 使用 Array.at() 方法获取 TypeScript 中数组的最后一个元素,例如 const last = arr.at(-1)。 当传递一个负索引时,at() 方法通过从数组末尾倒数返回一个元素。
if(ans.at(-1)[1] < intervals[j][0]){
ans.push(intervals[j]);
}else {
ans.at(-1)[1] = Math.max(ans.at(-1)[1] , intervals[j][1]);
}
}
return ans;
答案错误!!!!
[[1,4],[0,4]]
我的答案是[1 , 4]
排序没有排序成功吗????
排序是成功的,但是在排序之前就已经将第一个区间放入了答案数组,这样如果第一个区间不是最小的,就会有问题。应该在排序之后才开始构建答案数组。
修改代码:
function merge(intervals: number[][]): number[][] {
let len = intervals.length;
// 对原数组进行排序
intervals = intervals.sort((a , b) => a[0] - b[0]);//排序不完善
// 将原数组中的第一个放进去
let ans : number[][] = [intervals[0]];//Line 4: Char 22: error TS1011: An element access expression should take an argument.
// 遍历进行合并
for(let j = 1 ; j < len ; j++){
// 每次比较是要把答案数组中的最后一个的右值与当前数组的左值进行比较
// 使用 Array.at() 方法获取 TypeScript 中数组的最后一个元素,例如 const last = arr.at(-1)。 当传递一个负索引时,at() 方法通过从数组末尾倒数返回一个元素。
if(ans.at(-1)[1] < intervals[j][0]){
ans.push(intervals[j]);
}else {
ans.at(-1)[1] = Math.max(ans.at(-1)[1] , intervals[j][1]);
}
}
return ans;
};
成功啦!!!
其实这个题目难到我的并不是思路,而是ts中数组的使用,和这种数组包数组的使用,总结一下:
- 排序:排序没有给出参数,一个给出参数(intervals.sort((a , b) => a[0] - b[0]))
- 获取数组的最后一个元素:使用 Array.at() 方法获取 TypeScript 中数组的最后一个元素,例如 const last = arr.at(-1)。 当传递一个负索引时,at() 方法通过从数组末尾倒数返回一个元素。
- 获取数组中的数组的元素:ans.at(-1)[1]=最后一个元素数组索引为1的数据ans[]