LeetCode 435. Non-overlapping Intervals

本题给出一个数组,其中每个元素都包含一个开始和结束时间,要求在这个数组中删除最少的元素来使得整个数组中所有的活动没有重合。

本题就是一段时间内所能安排最大活动数目的简单变形,需要应用贪心思想来解决,首先将所有的interval按结束时间排序,排第一的interval一定保证,然后逐个检查,如果和上一个安排的活动没有重合(开始时间不小于上次安排的活动的结束时间)就也要保证,遍历完整个数组,就能求出要删除多少interval了。

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>

using namespace std;

struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

class Solution {
    static bool cmp(const Interval& a, const Interval& b) {
        return a.end < b.end;
    }

public:
    int eraseOverlapIntervals(vector<Interval>& intervals) {
        if (intervals.empty())
            return 0;

        sort(intervals.begin(), intervals.end(), cmp);

        int n = int(intervals.size());
        int lastEnd = intervals.front().start;
        for (auto interval : intervals) {
            if (interval.start >= lastEnd) {
                lastEnd = interval.end;
                n--;
            }
        }

        return n;
    }

};

int main(int argc, char const *argv[]) {
    Solution s;
    Interval a[5] = {Interval(1, 2), Interval(2, 3), Interval(3, 4), Interval(-100, -2), Interval(5, 7)};
    vector<Interval> intervals(a, a + 5);

    cout << s.eraseOverlapIntervals(intervals) << endl;

    system("pause");
    return 0;
}

这次刷到一个贪心的题目,做题时已经知道解题思路,解决起来很快。但是我觉得贪心和动态规划这两种题变化万千,指向性也没有图的题目那么明确,以后还需要多加练习,遇到不好解决的问题,可以试试往贪心或者动态规划上思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值