力扣算法ing(15 / 100)

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

我的思路:

  1. 什么时候能够合并?
  2. 在左值升序的情况下,答案数组的右值大于当前数组的左值
  3. 这个时候将右值更新为两者的最大值
  4. 放入答案数组

代码如下:

 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中数组的使用,和这种数组包数组的使用,总结一下:

  1. 排序:排序没有给出参数,一个给出参数(intervals.sort((a , b) => a[0] - b[0]))
  2. 获取数组的最后一个元素:使用 Array.at() 方法获取 TypeScript 中数组的最后一个元素,例如 const last = arr.at(-1)。 当传递一个负索引时,at() 方法通过从数组末尾倒数返回一个元素。
  3. 获取数组中的数组的元素:ans.at(-1)[1]=最后一个元素数组索引为1的数据ans[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值