2022-4-11 Leetcode 435.无重叠区间 —— 【贪心算法】

在这里插入图片描述
在这里插入图片描述
第一版,我本来打算是按照会议室的方式写的。每个房间放入连续的数组下标的序号。后来发现可能会出现同一个数组能够放入多个房间里,所以需要在每一轮开始前对房间进行排序。
本来自信慢慢的觉得自己能过,但是发现还是不行。

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.empty())
        return 0;
        sort(intervals.begin(),intervals.end());
        vector<vector<int>> room;
        room.push_back({0});
        for(int i = 1;i < intervals.size();i++){
            bool add = false;
            for(auto& q :room){
                sort(room.begin(),room.end(),[&](const vector<int>&a,const vector<int>&b)
                {return a.size() > b.size();});
                int j = q.back();
                if(intervals[j][1] <= intervals[i][0]){
                    q.push_back(i);
                    add = true;
                    break;
                }
            }
            if(!add){
                room.push_back({i});
            }
        }
        //return room.size()-1;
        vector<int> rs;
        for(auto& q:room){
            rs.push_back(q.size());
        }
        //int *maxS = *;
        rs.erase(max_element(rs.begin(),rs.end()));
        return accumulate(rs.begin(),rs.end(),0);
    }
};
//我的想法:建立一个会议室,能够放入同一间会议室的会议就放入同一个区间,如果不能就不放入。

[[-3035,30075],[1937,6906],[11834,20971],[44578,45600],[28565,37578],[19621,34415],[32985,36313],[-8144,1080],[-15279,21851],[-27140,-14703],[-12098,16264],[-36057,-16287],[47939,48626],[-15129,-5773],[10508,46685],[-35323,-26257]]
在这里插入图片描述
后来想了下,找到最多的区间放置未必是最多的算法,如果一个区间跨度太大,能够包括题目当中给的测试数据的多个区间。删掉这个会比较合算。但是如果这个区间一开始就放入最长的房间当中,之后细碎的空间就放不进去了。

为了解决上面的那个问题,就用贪心算法,每次都保留细小的区间,抛弃跨度较大的区间。

//把区间按照区间结尾小的排序,优先选择区间小的数字。
class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.empty())
        return 0;
        sort(intervals.begin(),intervals.end(),[&](const vector<int>& a,const vector<int>& b)
        {return a[1] < b[1];});
        int tot = 0;
        int pre = intervals[0][1];
        for(int i = 1;i < intervals.size();i++){
            if(intervals[i][0] < pre){
                tot++;
            }else {
                pre = intervals[i][1];
            }
        }
        return tot;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值