Leetcode 435. Non-overlapping Intervals

本文介绍了解决LeetCode上编号为435的题目——Non-overlapping Intervals的方法。该题旨在寻找最少需要移除的区间数量,以确保剩余区间互不重叠。文章详细阐述了通过排序和贪心策略解决此问题的算法,并提供了C++实现代码。

Leetcode 435. Non-overlapping Intervals

Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.

Example 1:
Input: [[1,2],[2,3],[3,4],[1,3]]
Output: 1

Example 2:
Input: [[1,2],[1,2],[1,2]]
Output: 2

Example 3:
Input: [[1,2],[2,3]]
Output: 0

Note:
1.You may assume the interval’s end point is always bigger than its start point.
2.Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.

题目大意:
给定含有若干个区间的数组,目标是去除其中尽可能少的区间数量使剩下的区间不重叠,边界重叠不算重叠。

解题思路:
首先对区间进行从小到大排序,如果后一个区间的左边界比前一个区间的右边界大则说明重叠,必须去掉一个。在这里采用贪心策略,去掉右边界大的,以确保现有区间长度最短。设置一个指针cur来标记遍历时的右边界,在以下两种情况下要更新cur:1.出现重叠而去掉右边界较大的区间时,更新为较小那个的右边界。2.当前区间的左边界大于等于cur时,更新为当前区间的右边界。时间复杂度为O(nlogn).

代码:

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size() <= 1)
            return 0;
        sort(intervals.begin(), intervals.end());
        int cur = intervals[0][1], num = 0;
        for(int i = 1; i < intervals.size(); i++)
        {
            if(intervals[i][0] >= cur)
                cur = intervals[i][1];
            else
            {
                num++;
                cur = min(cur, intervals[i][1]);
            }
                
        }
        return num;
    }
};
### LeetCode 435 非重叠区间问题的 C++ 实现 LeetCode435 题名为 **无重叠区间**(Non-overlapping Intervals),其目标是最小化移除区间的数量,使得剩下的区间不相互重叠。以下是该问题的一种高效解决方法。 #### 解决思路 此问题可以通过贪心算法来求解。核心思想是按照区间的结束时间进行升序排序,并尽可能多地保留那些最早结束的区间[^5]。这样可以为后续的区间留出更多空间,从而减少需要移除的区间数目。 具体步骤如下: 1. 对输入的区间列表按 `end` 值从小到大排序。 2. 初始化计数器变量用于记录所需删除的区间数以及上一个被选中的区间结束位置。 3. 遍历排序后的区间列表,如果当前区间的起始时间大于等于前一选定区间的结束时间,则更新最新结束时间为当前区间的结束时间;否则增加删除计数并跳过当前区间。 下面是基于上述逻辑编写的 C++ 实现: ```cpp #include <vector> #include <algorithm> using namespace std; class Solution { public: int eraseOverlapIntervals(vector<vector<int>>& intervals) { if (intervals.empty()) return 0; // Sort by end time of each interval. sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) -> bool{ return a[1] < b[1]; }); int count = 0; // Number of removed intervals int prevEnd = intervals[0][1]; // End point of the first selected interval for (size_t i = 1; i < intervals.size(); ++i){ if (intervals[i][0] >= prevEnd){ // If no overlap with previous one, update 'prevEnd' prevEnd = intervals[i][1]; } else{ // Overlap exists, increment removal counter but do not change 'prevEnd'. ++count; } } return count; } }; ``` #### 复杂度分析 - 时间复杂度:O(n log n),其中主要开销来自于对区间数组的排序操作。 - 空间复杂度:O(1),除了存储输入数据外不需要额外的空间资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值