0
点赞
收藏
分享

微信扫一扫

leedcode算法日更

木樨点点 2022-04-15 阅读 31
c++

贪心算法:

1.3 区间问题

题目描述

给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠

输入输出样例

题目解析:

首先将所有的区间按照第二个数字的额大小顺序进行排列,,然后对比每个区间的第一个数据看是否小于区间的第二个数据,如果有相交,则跳过该区间,如果不相交则保留。

1.判断是否为空,如果是空的话,返回0

if(intervals.empty())

{return 0;}

2.使用排序函数进行排序sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b)){

return a[1]>b[1]}

3.进行比较,逐一进行 n=intervals.size();

int total=0//统计需要删除的数量,prev=intervals[0][1];//从第一个数据的第二个开始

for(int i=1;i<n;++i){if(intervals[i][0]<prev)

{++total;

}else prev=[i][1];

}return  total;

更加通俗的理解:首先prev=2;i=1时,intervals=1,1<2 ,total=1;i=2时interval=2<3

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.empty())
        {
            return 0;
        }
        sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b)
        {
            return a[1]<b[1];
        });
        int n=intervals.size();
        int total=0,prev=intervals[0][1];
        for(int i=1;i<n;i++)
        {
            if(intervals[i][0]<prev)
            {
                total++;
            }
            
            else{
                prev=intervals[i][1];
            }
        }
        return total;
    }
};

种花问题(605)

题目描述:

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组  flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。

题目解答:

如果想要插入1个花朵,就需要中间有三个0,也就是10001.

只需要满足在a[i]=0,a[i+1]=0,a[i-1]=0或者边界情况,a[i]=0,i-1为0,a[i+1]=0,或者a[i]=0,a[i-1]=0,i+1=a,size();

满足其中之一,就另a[i]为1,继续进行循环 

class Solution {
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int total=flowerbed.size();
        int res=0;
        for(int i=0;i<total;i++)
        {
            if(!flowerbed[i] && (!flowerbed[max(0 , i - 1)] && !flowerbed[min(total - 1 , i + 1)]))
            {
                flowerbed[i]=1;
                res++;
            }
        }
        return res>=n;
    }
};

举报

相关推荐

0 条评论