当前位置: 面试刷题>> 无重叠区间 (经典算法题500道)


题目描述补充

题目:无重叠区间

给定一个区间的集合,每个区间都表示为闭区间 [start, end],其中 start 是区间的起始位置,end 是区间的结束位置,且满足 start <= end。请找出需要移除的区间的最小数量,使得剩余区间互不重叠。

注意

  • 你可以认为区间的起始位置和结束位置都是非负整数。
  • 区间 [1, 2] 和区间 [2, 3] 有一个公共点,因此它们被视为重叠区间。

示例

输入: [[1,2],[2,3],[3,4],[1,3]]

输出: 1

解释: 移除 [1,3] 后,剩下的区间 [1,2][2,3][3,4] 互不重叠。

PHP 示例代码

function eraseOverlapIntervals($intervals) {
    if (empty($intervals)) {
        return 0;
    }
    
    // 按照区间的结束位置进行排序
    usort($intervals, function($a, $b) {
        return $a[1] - $b[1];
    });
    
    $count = 1; // 至少保留一个区间
    $end = $intervals[0][1]; // 初始化为第一个区间的结束位置
    
    for ($i = 1; $i < count($intervals); $i++) {
        if ($intervals[$i][0] >= $end) {
            // 如果当前区间的起始位置大于或等于前一个区间的结束位置,说明不重叠
            $end = $intervals[$i][1]; // 更新结束位置
            $count++;
        }
    }
    
    // 需要移除的区间数量 = 总区间数 - 不重叠的区间数
    return count($intervals) - $count;
}

// 测试用例
$intervals = [[1,2],[2,3],[3,4],[1,3]];
echo eraseOverlapIntervals($intervals); // 输出 1

Python 示例代码

def eraseOverlapIntervals(intervals):
    if not intervals:
        return 0
    
    # 按照区间的结束位置进行排序
    intervals.sort(key=lambda x: x[1])
    
    count = 1  # 至少保留一个区间
    end = intervals[0][1]  # 初始化为第一个区间的结束位置
    
    for interval in intervals[1:]:
        if interval[0] >= end:
            # 如果当前区间的起始位置大于或等于前一个区间的结束位置,说明不重叠
            end = interval[1]  # 更新结束位置
            count += 1
    
    # 需要移除的区间数量 = 总区间数 - 不重叠的区间数
    return len(intervals) - count

# 测试用例
intervals = [[1,2],[2,3],[3,4],[1,3]]
print(eraseOverlapIntervals(intervals))  # 输出 1

JavaScript 示例代码

function eraseOverlapIntervals(intervals) {
    if (intervals.length === 0) {
        return 0;
    }
    
    // 按照区间的结束位置进行排序
    intervals.sort((a, b) => a[1] - b[1]);
    
    let count = 1; // 至少保留一个区间
    let end = intervals[0][1]; // 初始化为第一个区间的结束位置
    
    for (let i = 1; i < intervals.length; i++) {
        if (intervals[i][0] >= end) {
            // 如果当前区间的起始位置大于或等于前一个区间的结束位置,说明不重叠
            end = intervals[i][1]; // 更新结束位置
            count++;
        }
    }
    
    // 需要移除的区间数量 = 总区间数 - 不重叠的区间数
    return intervals.length - count;
}

// 测试用例
const intervals = [[1,2],[2,3],[3,4],[1,3]];
console.log(eraseOverlapIntervals(intervals)); // 输出 1

码小课网站中有更多相关内容分享给大家学习,希望大家能够继续深入学习算法和数据结构的知识,提高自己的编程能力。

推荐面试题